Gym - 101431C Canada Day [模拟]
2018-01-28 19:07
274 查看
题意:给你n个镭射灯的坐标,每个镭射灯有四种激光射出的方式,分别是射出两条夹角为90度的光线(↑→,→↓,↓←,←↑),当光线照射到镭射灯的时候可以等到一个value,求每次加入镭射灯的时候,图的最大value。
题解:我们可以考虑,每次加入一个镭射灯时,能改变的只有上下左右最近的灯的情况,那么我们对这些灯进行重新查找最值并更新,然后将当前灯也更新,就可以得到当前的值了。
AC代码:
题解:我们可以考虑,每次加入一个镭射灯时,能改变的只有上下左右最近的灯的情况,那么我们对这些灯进行重新查找最值并更新,然后将当前灯也更新,就可以得到当前的值了。
AC代码:
#include<stdio.h> #include<set> #include<algorithm> #define N 100005 using namespace std; typedef long long ll; ll x ,y ,val ; ll bx ,by ; ll ans ; ll sum=0; struct node { ll xy,id; node(){} node(ll xy,ll id) { this->xy=xy; this->id=id; } }; set<node>stx ,sty ; set<node>::iterator it; bool operator<(node a,node b) { return a.xy<b.xy; } ll findup(ll xpos,ll ypos) { it=stx[xpos].upper_bound(node(ypos,0)); if(it==stx[xpos].end())return -1; return it->id; } ll findright(ll xpos,ll ypos) { it=sty[ypos].upper_bound(node(xpos,0)); if(it==sty[ypos].end())return -1; return it->id; } ll finddown(ll xpos,ll ypos) { it=stx[xpos].lower_bound(node(ypos,0)); if(it==stx[xpos].begin())return -1; it--; return it->id; } ll findleft(ll xpos,ll ypos) { it=sty[ypos].lower_bound(node(xpos,0)); if(it==sty[ypos].begin())return -1; it--; return it->id; } void change(ll id) { sum-=ans[id]; ans[id]=0; ll now=0; ll dir[4]; dir[0]=findup(x[id],y[id]); dir[1]=findright(x[id],y[id]); dir[2]=finddown(x[id],y[id]); dir[3]=findleft(x[id],y[id]); for(ll i=0;i<4;i++) { ll sum1=(dir[i]==-1?0:val[dir[i]]); ll sum2=(dir[(i+1)%4]==-1?0:val[dir[(i+1)%4]]); now=max(now,sum1+sum2-ans[id]); } ans[id]=now; sum+=now; } int main() { ll n; scanf("%lld",&n); ll xtot=0,ytot=0; for(ll i=0;i<n;i++) { scanf("%lld%lld%lld",&x[i],&y[i],&val[i]); bx[xtot++]=x[i]; by[ytot++]=y[i]; } sort(bx,bx+xtot); sort(by,by+ytot); xtot=unique(bx,bx+xtot)-bx; ytot=unique(by,by+ytot)-by; for(ll i=0;i<n;i++) { x[i]=lower_bound(bx,bx+xtot,x[i])-bx; y[i]=lower_bound(by,by+ytot,y[i])-by; stx[x[i]].insert(node(y[i],i)); sty[y[i]].insert(node(x[i],i)); ll dir[4]; if((dir[0]=findup(x[i],y[i]))!=-1)change(dir[0]); if((dir[1]=findright(x[i],y[i]))!=-1)change(dir[1]); if((dir[2]=finddown(x[i],y[i]))!=-1)change(dir[2]); if((dir[3]=findleft(x[i],y[i]))!=-1)change(dir[3]); change(i); printf("%lld\n",sum); } }
相关文章推荐
- Codeforces Gym 101164 D. Reading Digits (模拟)
- Codeforces Gym 101158 E. Infallibly Crack Perplexing Cryptarithm (模拟 + 语法分析)
- Appearance Analysis Gym - 101173A(模拟)
- Gym - 101341M-简单模拟-Last Man Standing
- Gym 101341G I love Codeforces 模拟
- 【模拟】BAPC2014 G Growling Gears (Codeforces GYM 100526)
- Gym - 101196B Foosball Dynasty【模拟】
- 【模拟】BAPC2014 G Growling Gears (Codeforces GYM 100526)
- C - Cued In Gym - 101606C(模拟水题)
- codeforces gym 100286 I iSharp (字符串模拟)
- UVaLive 6581 && Gym 100299B What does the fox say? (模拟+STL)
- Codeforces Gym 101158 B. Quality of Check Digits (模拟)
- Gym 100952B&&2015 HIAST Collegiate Programming Contest B. New Job【模拟】
- Gym 101653T Runes (模拟)
- Gym - 101190H Hard Refactoring——模拟
- Gym 100499I (数学 模拟)
- Codeforces Gym 101505(2016-2017 CTU Open Contest) D---群论、模拟
- Gym 100851E Easy Problemset (水题,模拟)
- Gym - 101572G -(set&细节)|(模拟&理解)|树状数组&好题-Galactic Collegiate Programming Contest
- Codeforces Gym 100650C The Game of Efil 模拟+阅读题