51nod 1276 岛屿的数量(思维)
2017-03-02 19:56
330 查看
这道题需要先排序再对比,然后统一输出答案,不然会超时
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define LL long long #define MOD 1000000007 #define M 50010 #define INF 0x3f3f3f3f struct node { int u, pos; }; node no[M], ne[M]; bool cmp(node t1, node t2) { return t1.u < t2.u; } int main() { int n, q, a[M], sum, down, up; while(scanf("%d%d", &n, &q) != EOF) { int top = 0; down = INF; up = 0; for(int i=0; i<n; i++) { scanf("%d", &no[i].u); no[i].pos = i; } for(int i=0; i<q; i++) { scanf("%d", &ne[i].u); ne[i].pos = i; } sort(ne, ne+q, cmp); sort(no, no+n, cmp); int j = 0; bool vis[M]; memset(vis, 0, sizeof(vis)); sum = 1; for(int i=0; i<q; i++) { while(no[j].u <= ne[i].u && j < n) { if(!no[j].pos) { if(vis[1]) { sum--;//最左边且旁边的被淹没 } } else if(no[j].pos == n-1) { if(vis[n-2]) { sum--;//最右边 } } else { if(vis[no[j].pos-1] && vis[no[j].pos+1])//考虑两边都已经被淹 { sum--; } if(!vis[no[j].pos-1] && !vis[no[j].pos+1])//两边都没有被淹 { sum++; } //只有只有一边被淹的相当于没有变化 } vis[no[j].pos] = 1;//记录被淹的 j++; } a[ne[i].pos] = sum;//记录该询问 } for(int i=0; i<q; i++) { printf("%d\n", a[i]); } } return 0; }
相关文章推荐
- 51nod 1276 岛屿的数量(贪心策略__锻炼思维)
- 51nod 1276 岛屿的数量 思维题,很棒的题目
- 岛屿的数量 51Nod - 1276(思维+贪心+单调)
- 51NOD 1276 岛屿的数量(脑洞+思维)
- 51NOD 1276 岛屿的数量(脑洞 + 思维)
- 51nod 1276 岛屿的数量(思维题)
- 51nod 1276 岛屿的数量(锻炼思维的好题)
- 51nod 1276 岛屿的数量【思维】好题~
- 51nod 1276 岛屿的数量
- 51nod 1276 岛屿的数量
- 51Nod - 1276 岛屿数量
- 51Nod-1276-岛屿的数量
- 51Nod 1276 岛屿的数量(好题)
- 51nod 1276 岛屿的数量
- 51nod-【1276 岛屿的数量】
- 岛屿的数量 51Nod - 1276
- 51nod 1276 岛屿的数量 By Assassin
- 51nod 1276 岛屿的数量 神奇做法
- 51nod 1276:岛屿的数量 (贪心)
- 51nod 1276 岛屿的数量