HDU 4831 Scenic Popularity 暴力模拟
生活随笔
收集整理的這篇文章主要介紹了
HDU 4831 Scenic Popularity 暴力模拟
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Scenic Popularity
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 340????Accepted Submission(s): 110
假設所有景點區和休息區都是X軸直線上的一系列頂點,所對應的坐標Xi 保證唯一。每個景點區有個初始的熱度值,而一個休息區(坐標為Xi)的熱度值等于離它距離最近的景點區Xj的熱度值(距離定義為|Xi-Xj|),如果此休息區與兩個景點區的距離一樣,則休息區的熱度值選擇兩個景點區中的熱度值最大值,如果兩個熱度值都一樣,則隨意選擇其中一個。
度度熊在出門之前會經常去查看百度地圖,每次查看前會有某些景點區的熱度值已發生改變,從而也會導致周圍的休息區的熱度值發生改變,然后度度熊想知道當前熱度值<=Rk的頂點(包括景點區和休息區)有多少個
?
Input 輸入數據的第一行是測試Case的個數(T<=100)。每個Case的第一行是N(0<N<=10000),表示景點區和休息區的總數。
接著會有N行數據,每一列首先是頂點的X坐標Xi (0< Xi <=1e8),第二列是一個整數Hi(0=<Hi <=100000),如果Hi 不為0,則表示當前頂點為風景區且初始的熱度值為Hi,否則表示當前頂點為休息區。這N行數據會按照坐標Xi遞增的方式依次給出。
接著的一行數據是操作的次數K(K<=100),最后會有K行數據,每一行的第一列要么是’U’或者’Q’,’U’表示當前操作為更改熱度操作,’Q’表示當前操作為查詢操作。如果是更改操作,接著會有兩列數據,分別是熱度值要改變的風景區的下標Lk(0<=Lk<N)以及改變后的熱度值Vk(0< Vk<=100000);如果是查詢操作,第二列是要查詢的熱度范圍Rk(0< Rk<=100000)
?
Output 對于第k組測試數據,第一行輸出Case #k:,接下來對每次查詢操作(即Q操作)會輸出一個整數,表示滿足條件的頂點數有多少個?
Sample Input 1 4 10 0 20 3 30 0 40 2 3 Q 3 U 3 4 Q 3?
Sample Output Case #1: 4 2?
Source 2014年百度之星程序設計大賽 - 初賽(第二輪) 題目分析: 跟著題意模擬就行了,主要是通過對每個休息區保存離他距離最近的至多兩個風景區(不可能比這個還多,因為只在X軸上),然后對每個風景區能影響到的休息區連邊,當風景區的熱度改變時, 就通過這條邊跳到休息區,進而改變休息區的熱度值(可能不會改變)。 代碼如下: #include <stdio.h> #include <string.h> typedef long long ll; const int O = 1000000; const int maxn = 10005; typedef struct E{int v, n; }E; typedef struct point{int x, h;int g[2]; }point; point a[maxn]; E edge[O]; int Adj[maxn], l; int f[maxn]; void addedge(int u, int v){edge[l].v = v; edge[l].n = Adj[u]; Adj[u] = l++; } void check(int i, int i1, int i2){if(!i2 || a[i1].h >= a[i2].h) a[i].h = a[i1].h;else if(a[i2].h > a[i1].h) a[i].h = a[i2].h; } int abs(int x){return x > 0 ? x : -x; } int read(){char ch = ' ';while(ch < '0' || ch > '9') ch = getchar();int x = 0;while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x; } void work(){int n, q, x, y;char ch[2];n = read();memset(Adj, -1, sizeof(Adj[0]) * (n + 1));memset(a, 0, sizeof(a[0]) * (n + 1));l = 0;int flag = 0, pre = 0, next = 0;for(int i = 1; i <= n; ++i){a[i].x = read(); a[i].h = read();if(a[i].h) flag = 1;}if(flag){for(int i = 1; i <= n; ++i){if(!a[i].h){a[i].g[0] = pre;if(next <= i && next <= n){next = i + 1;while(next <= n){if(a[next].h) break;++next;}}a[i].g[1] = (next <= n ? next : 0);if(!a[i].g[0] || abs(a[i].x - a[a[i].g[0]].x) > abs(a[a[i].g[1]].x - a[i].x)){a[i].g[0] = a[i].g[1];a[i].g[1] = 0;}else if(abs(a[i].x - a[a[i].g[0]].x) < abs(a[a[i].g[1]].x - a[i].x)){a[i].g[1] = 0;}if(a[i].g[0]) addedge(a[i].g[0], i);if(a[i].g[1]) addedge(a[i].g[1], i);}else pre = i;}}for(int i = 1; i <= n; ++i){if(!a[i].h) check(i, a[i].g[0], a[i].g[1]);}scanf("%d", &q);for(int i = 0; i < q; ++i){scanf("%s", ch);if(ch[0] == 'Q'){int cnt = 0;scanf("%d", &x);for(int j = 1; j <= n; ++j) if(a[j].h <= x) cnt++;printf("%d\n", cnt);}else{scanf("%d%d", &x, &y);a[++x].h = y;for(int j = Adj[x]; ~j; j = edge[j].n){int v = edge[j].v;check(v, a[v].g[0], a[v].g[1]);}}} } int main(){int t, cas;for(scanf("%d", &t), cas = 1; cas <= t; ++cas){printf("Case #%d:\n", cas);work();}return 0; } HDU 4831?
轉載于:https://www.cnblogs.com/ac-luna/p/3752970.html
總結
以上是生活随笔為你收集整理的HDU 4831 Scenic Popularity 暴力模拟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单数据类型转换
- 下一篇: Linux01-Linux编辑内核定制属