标签:
input | output |
---|---|
5 Abramovich London 15000000000 Deripaska Moscow 10000000000 Potanin Moscow 5000000000 Berezovsky London 2500000000 Khodorkovsky Chita 1000000000 25 9 1 Abramovich Anadyr 5 Potanin Courchevel 10 Abramovich Moscow 11 Abramovich London 11 Deripaska StPetersburg 15 Potanin Norilsk 20 Berezovsky Tbilisi 21 Potanin StPetersburg 22 Berezovsky London |
Anadyr 5 London 14 Moscow 1
|
分析:线段树单点更新查询最大值坐标;
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #define rep(i,m,n) for(i=m;i<=n;i++) #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++) #define mod 1000000007 #define inf 0x3f3f3f3f #define vi vector<int> #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) #define pii pair<int,int> #define Lson L, mid, rt<<1 #define Rson mid+1, R, rt<<1|1 const int maxn=1e5+10; using namespace std; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;} int n,m,k,t,d,now[maxn],num,cnt; map<string,int>ci; map<string,int>id; map<int,string>to; ll mo[maxn]; struct node { string x,y; }a[maxn]; struct node1 { int t; string x,y; }q[maxn]; struct node2 { int id,t; bool operator<(const node2&p)const { return to[id]<to[p.id]; } }ans[maxn]; struct Node { ll Max, lazy; } T[maxn<<2]; void PushUp(int rt) { T[rt].Max = max(T[rt<<1].Max, T[rt<<1|1].Max); } void PushDown(int L, int R, int rt) { int mid = (L + R) >> 1; ll t = T[rt].lazy; T[rt<<1].Max += t; T[rt<<1|1].Max += t; T[rt<<1].lazy += t; T[rt<<1|1].lazy += t; T[rt].lazy = 0; } void Update(int l, int r, ll v, int L, int R, int rt) { if(l==L && r==R) { T[rt].lazy += v; T[rt].Max += v; return ; } int mid = (L + R) >> 1; if(T[rt].lazy) PushDown(L, R, rt); if(r <= mid) Update(l, r, v, Lson); else if(l > mid) Update(l, r, v, Rson); else { Update(l, mid, v, Lson); Update(mid+1, r, v, Rson); } PushUp(rt); } int Query(int L, int R, int rt) { if(L==R)return L; if(T[rt].lazy)PushDown(L,R,rt); int mid=L+R>>1; if(T[rt<<1].Max>T[rt<<1|1].Max)return Query(Lson); else if(T[rt<<1].Max<T[rt<<1|1].Max)return Query(Rson); else return 0; } int main() { int i,j; scanf("%d",&n); rep(i,1,n) { cin>>a[i].x>>a[i].y>>mo[i]; id[a[i].x]=i; if(!ci[a[i].y])ci[a[i].y]=++num,to[num]=a[i].y; now[i]=ci[a[i].y]; } scanf("%d%d",&d,&m); rep(i,1,m) { cin>>q[i].t>>q[i].x>>q[i].y; if(!ci[q[i].y])ci[q[i].y]=++num,to[num]=q[i].y; } rep(i,1,num)ans[i].id=i; rep(i,1,n)Update(ci[a[i].y],ci[a[i].y],mo[i],1,num,1); j=1; rep(i,1,d) { while(j<=m&&q[j].t==i-1) { Update(now[id[q[j].x]],now[id[q[j].x]],-mo[id[q[j].x]],1,num,1); Update(ci[q[j].y],ci[q[j].y],mo[id[q[j].x]],1,num,1); now[id[q[j].x]]=ci[q[j].y]; j++; } if((cnt=Query(1,num,1)))ans[cnt].t++; } sort(ans+1,ans+num+1); rep(i,1,num)if(ans[i].t)printf("%s %d\n",to[ans[i].id].c_str(),ans[i].t); //system("Pause"); return 0; }
标签:
原文地址:http://www.cnblogs.com/dyzll/p/5851539.html