日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

妄想集合(牛客练习赛90)

發布時間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 妄想集合(牛客练习赛90) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

妄想集合(牛客練習賽90)

題意:

開始有 n 個可重集合,開始時每一個集合中都有一個數,有 m 個操作。

Quant?l?r?x\text{Quant l r x}Quant?l?r?x:往編號在 l~rl\sim rlr 的每個集合中加入一個數 x。
Ask?l?r\text{Ask l r}Ask?l?r:詢問能否從 l~rl\sim rlr的集合中取出三個數使得他們能作為邊長組成一個三角形(即最小兩個和要大于最大的)。
1<=n,m<=1e5
所有數<=1e9

題解:

一開始在想如何快速判斷邊長能否組成三角形,陷入了死胡同里,后來在隊友一說才想起來,不能組成三角形的情況就是斐波那契而數列。
以前有遇到過,一個最大的集合無法組成三角形,那么這個集合中的元素為1,1,2,3,5,6…就是斐波那契數列,而都知道這個數列增長是否快的,到1e9以內最多也才40多個,也就是說如果一個區間內元素個數大于上限(我們將上限lim定為60)直接就是Yes,修改時也只需要修改元素個數小于lim的集合即可
判斷的時候,只要集合內元素大于lim就是Yes,如果小于,我們就直接硬判斷即可,因為一共才不到60個數
復雜度:O(n?logn?60)O(n*logn*60)O(n?logn?60)

代碼:

#include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b); #define Memory() printf("%.2lfMB\n",(&Most-&Handsome)/1024.0/1024.0); using namespace std; bool Handsome; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll= 1e18; const int INF_int= 0x3f3f3f3f; void read(){}; template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar) {x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...); } template <typename T> inline void write(T x) {if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0'); } void rd_test() { #ifdef ONLINE_JUDGE #elsestartTime = clock ();freopen("data.in", "r", stdin); #endif } void Time_test() { #ifdef ONLINE_JUDGE #elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); #endif } int n,m; const int maxn=1e5+9; vector<int>vec[maxn]; set<int>pos; bool Most; int main() {//rd_test();cin>>n>>m;for(int i=1;i<=n;i++){int x;cin>>x;vec[i].push_back(x);//每個集合pos.insert(i); }while(m--){string op;int l,r;cin>>op>>l>>r;if(op=="Quant"){int x;cin>>x;set<int>::iterator it=pos.lower_bound(l);while(it!=pos.end()&&*it<=r){//對集合進行維護 vec[(*it)].push_back(x);if(vec[*it].size()>60)pos.erase(it++);else it++; }}else {if(r-l+1>60){puts("YES");continue;}vector<int>tmp;for(int i=l;i<=r;i++) tmp.insert(tmp.end(),vec[i].begin(),vec[i].end());sort(tmp.begin(),tmp.end());bool flag=0;for(int i=1;i<tmp.size()-1;i++){if(tmp[i-1]+tmp[i]>tmp[i+1]){puts("YES");flag=1;break;}}if(!flag)puts("NO");}}return 0;//Time_test(); }

總結

以上是生活随笔為你收集整理的妄想集合(牛客练习赛90)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。