1. 程式人生 > >【bzoj2724】[Violet 6]蒲公英 (注意:題面有毒!)

【bzoj2724】[Violet 6]蒲公英 (注意:題面有毒!)

傳送門:http://www.lydsy.com/JudgeOnline/problem.php?id=2724
思路:首先我要說的是,題面真的有毒啊,,,
我不停WA發現讀錯了題,改了還WA發現又讀錯了,,一直該改改,,最後卡時過,,,我也是醉了,,,種類,,編號,,傻傻分不清啊!!
程式碼:

#include<cstring>
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#define N 40000
#define M 200 #define inf 1e9 using namespace std; int n,m,ll,num,a[N+5],a0[N+5],b[N+5],pos[N+5],maxi,maxj,c[M+5][N],c1[M+5][N], cnt[M+5][M+5],link1[N+5],s[N+5],t[N+5],l,r,lastans,w,ls,rs,id[N+5]; inline int getnum(){ char c; int num; while (!isdigit(c = getchar())); num = c - '0'; while
(isdigit(c = getchar())) num = 10 * num + c - '0'; return num; } void init(){ n = getnum(); m = getnum(); ll = ceil(sqrt(n)); num = 0; for (int i = 1;i <= n; ++i) a[i] = a0[i] = getnum(); sort(a0 + 1,a0 + n + 1); b[0] = inf; for (int i = 1;i <= n; ++i) b[i] = upper_bound(a0 + 1
,a0 + n + 1,a[i]) - a0 - 1; //for (int i = 1;i <= n; ++i) cout<<b[i]<<" "; //cout<<endl; for (int i = 1;i <= n; ++i) id[b[i]] = a[i]; for (int i = 1;i <= n; ++i) pos[i] = i/ll,num = max(num,pos[i]); //cout<<ll<<endl; //for (int i = 1;i <= n; ++i) cout<<pos[i]<<endl; pos[0] = -1; pos[n + 1] = -1; for (int i = 1;i <= n; ++i){ if (pos[i] != pos[i - 1]) s[pos[i]] = i; if (pos[i] != pos[i + 1]) t[pos[i]] = i;} //for (int i = 0;i <= num; ++i) cout<<s[i]<<" "<<t[i]<<endl; } void make_it(){ for (int i = 1;i <= n; ++i) c1[pos[i]][b[i]] ++; for (int i = 0;i <= num; ++i) if (i >= 1) for (int j = 1;j <= n; ++j) c1[i][j] += c1[i - 1][j]; memset(cnt,0,sizeof(cnt)); memset(link1,0,sizeof(link1)); for (int i = num;i >= 0; --i) { maxi = maxj = 0; for (int j = i; j >= 0; --j){ for (int k = t[j]; k >= s[j]; --k){ c[i][b[k]] ++; if (c[i][b[k]] > maxi||c[i][b[k]] == maxi&&b[k] < b[maxj]) maxi = c[i][b[k]],maxj = k; } cnt[j][i] = maxj; }} } inline int ask(int l,int r){ memset(link1,0,sizeof(link1)); ls = pos[l],rs = pos[r]; maxi = 0; maxj = 0; if (rs - ls <= 1) { for (int i = r; i >= l; --i){ ++link1[b[i]]; if (link1[b[i]] > maxi||link1[b[i]] == maxi&&b[i] < b[maxj]) maxi = link1[b[i]],maxj = i;}} else { maxj = cnt[ls + 1][rs - 1]; maxi = c1[rs - 1][b[maxj]] - c1[ls][b[maxj]]; for (int i = s[rs];i <= r; ++i){ ++link1[b[i]]; w = link1[b[i]] + c1[rs - 1][b[i]] - c1[ls][b[i]]; if (w > maxi||w == maxi&&b[i] < b[maxj]) { maxi = w; maxj = i; }} for (int i = t[ls];i >= l; --i){ ++link1[b[i]]; w = link1[b[i]] + c1[rs - 1][b[i]] - c1[ls][b[i]]; if (w > maxi||w == maxi&&b[i] < b[maxj]) maxi = w,maxj = i;} } return maxj; } void DO_IT(){ lastans = 0; make_it(); for (int j = 1;j <= m; ++j){ l = getnum(); r = getnum(); l = (l + lastans - 1)%n + 1; r = (r + lastans - 1)%n + 1; //cout<<l<<" "<<r<<endl; //cout<<l<<" "<<r<<endl; if (l > r) swap(l,r); lastans = a[ask(l,r)]; printf("%d\n",lastans); } } int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); init(); DO_IT(); //fclose(stdin); fclose(stdout); return 0; }

相關推薦

bzoj2724[Violet 6]蒲公英 注意有毒

傳送門:http://www.lydsy.com/JudgeOnline/problem.php?id=2724 思路:首先我要說的是,題面真的有毒啊,,, 我不停WA發現讀錯了題,改了還WA發現又讀錯了,,一直該改改,,最後卡時過,,,我也是醉了,,,種類

bzoj2724[Violet 6]蒲公英 分塊+STL-vector

tdi data 時間復雜度 include ole log put for output 題目描述 輸入 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 輸出 樣例輸入 6

bzoj2724: [Violet 6]蒲公英分塊

pro moto 第一步 ++i 出了 for 個數 b+ span 傳送門 md調了一個晚上最後發現竟然是空間開小了……明明算出來夠的…… 講真其實我以前不太瞧得起分塊,覺得這種基於暴力的數據結構一點美感都

BZOJ2724. [Violet 6]蒲公英分塊

8個小時的鬥智鬥勇… 我也不知道為什麼這道題成了我目前所有學科中用時最長的一道題 聽說此題可以各種暴力卡過233 其實就是一個很簡單的預處理,由於分塊思想(即只暴力處理角塊)我們就可以預處理出整塊之間的眾數(nsqrt(n)),然後對於每個區間我們就需要處理角

[BZOJ2724][Violet 6]蒲公英分塊

題目描述 傳送門 題解 預處理一坨。 塊外暴力。 塊內sort(關鍵字先權值再位置),然後二分找。 程式碼 #include<algorithm> #include<iostream> #include<cstri

BZOJ4869相逢是問候線段樹,歐拉定理

post class problem spa bzoj struct printf 計算 oid 【BZOJ4869】相逢是問候(線段樹,歐拉定理) 題面 BZOJ 題解 根據歐拉定理遞歸計算(類似上帝與集合的正確用法) 所以我們可以用線段樹維護區間最少的被更新的多少次 如

BZOJ3309DZY Loves Math莫比烏斯反演

namespace ... ++ bre getchar stream 那種 getc 分解質 【BZOJ3309】DZY Loves Math(莫比烏斯反演) 題面 求 \[\sum_{i=1}^a\sum_{j=1}^bf(gcd(a,b))\] 其中,\(f(x)\)

bzoj3083遙遠的國度樹鏈剖分+線段樹

region ont lin names 一個點 輸入輸出格式 -- wap 操作數 題目描述 zcwwzdjn在追殺十分sb的zhx,而zhx逃入了一個遙遠的國度。當zcwwzdjn準備進入遙遠的國度繼續追殺時,守護神RapiD阻攔了zcwwzdjn的去路,他需要zcw

BZOJ3551Peaks加強版Kruskal重構樹,主席樹

www top return ostream https zoj 高度 ble lib 【BZOJ3551】Peaks加強版(Kruskal重構樹,主席樹) 題面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i。有些山峰之

BZOJ1898[ZJOI2005]沼澤鱷魚矩陣快速冪,動態規劃

表示 ear 構建 esp ++ 方案 set 沒有 ring 【BZOJ1898】[ZJOI2005]沼澤鱷魚(矩陣快速冪,動態規劃) 題面 BZOJ 洛谷 題解 先吐槽,說好了的鱷魚呢,題面裏面全是食人魚 看到數據範圍一眼想到矩乘。 先不考慮食人魚的問題,直接設\(f[

LeetCode深搜DFS共85

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } 【98】Validate Binary Search Tree  【99】Recover Binary Search Tree  【100】Same Tr

UVA10816Travel in Desert 最小瓶頸路+最短路

UVA10816 Travel in Desert 題目大意 沙漠中有一些道路,每個道路有一個溫度和距離,要求s,t兩點間的一條路徑,滿足溫度最大值最小,並且長度最短 輸入格式 輸入包含多組資料。 每組資料第一行為兩個整數\(n\) 和\(e\) 。表示綠洲數量和連線綠洲的道路數量。 每組資料第二

洛谷 P3919 模板可持久化陣列可持久化線段樹/平衡樹-可持久化線段樹(單點更新,單點查詢)

P3919 【模板】可持久化陣列(可持久化線段樹/平衡樹) 題目背景 UPDATE : 最後一個點時間空間已經放大 標題即題意 有了可持久化陣列,便可以實現很多衍生的可持久化功能(例如:可持久化並查集) 題目描述 如題,你需要維護這樣的一個長度為 NN 的陣列,支援如下幾種操作

洛谷P3919 模板可持久化陣列可持久化線段樹/平衡樹

主席樹太費空間了,而本題也無需維護任何區間資訊,只是查詢歷史版本點值,沒必要構造可持久化線段樹,我們可以構建結構類似於 BST 的可持久化資料結構,這樣每個非葉節點也會帶有權值,不會被浪費掉 Code; #include<cstdio> #include<algorit

JS----閉包問題閉包中的典範

function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,

LeetCode圖論 graph共20

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } 【133】Clone Graph  【207】Course Schedule  【210】Course Schedule II  【261】G

LeetCode字首樹 trie共14

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } 【208】Implement Trie (Prefix Tree)  【211】Add and Search Word - Data structure design

Luogu P3919 模板可持久化陣列可持久化線段樹/平衡樹

題面跳轉站 題目背景 UPDATE : 最後一個點時間空間已經放大 標題即題意 有了可持久化陣列,便可以實現很多衍生的可持久化功能(例如:可持久化並查集) 題目描述 如題,你需要維護這樣的一個長度為 NN 的陣列,支援如下幾種操作 在某個歷史版

P3919 模板可持久化陣列可持久化線段樹/平衡樹

主席樹模板題,學了下主席樹的模板 主席樹的核心思想是每次儲存下來每次單點修改之後的線段樹的資料,但這樣肯定會mle,所以有一個優化的方法:因為每次只更新一個點,那麼在這個線段樹裡只有這個點所在的那一條鏈可能會修改,也就是說我們只要記錄這一條鏈就足夠了,其他的資料我們只要

LeetCode]add Two Numbers兩單鏈表對應數值之和

題目 You are given two linked lists representing two non-negative numbers. The digits are stored in re