Submission #20418

#TimeUsernameProblemLanguageResultExecution timeMemory
20418tlwpdus (#35)초음속철도 (OJUZ11_rail)C++98
100 / 100
666 ms43976 KiB
#include<stdio.h> #include<algorithm> #include<vector> #include<math.h> #include<queue> using namespace std; typedef long long ll; typedef pair<int,int> pii; const ll MOD = 1000000007; ll po[200100] = {1}; struct node { ll val, rex; node *l, *r; node(){val=rex=0;l=r=0;} void pd() { l->val *= po[rex]; l->val %= MOD; r->val *= po[rex]; r->val %= MOD; l->rex += rex; r->rex += rex; rex = 0; } void pu() { val = (l->val + r->val)%MOD; } void init(int s, int e) { if (s==e) { return; } int m = (s+e)>>1; l = new node(); l -> init(s,m); r = new node(); r -> init(m+1,e); } void upd(int s, int e, int idx, ll v) { if (e<idx||idx<s) return; if (s==e) { val += v; val %= MOD; return; } int m = (s+e)>>1; pd(); l -> upd(s,m,idx,v); r -> upd(m+1,e,idx,v); pu(); } void upde(int s, int e, int S, int E, ll ex) { if (e<S||E<s) return; if (S<=s&&e<=E) { rex += ex; val *= po[ex]; val %= MOD; return; } int m = (s+e)>>1; pd(); l -> upde(s,m,S,E,ex); r -> upde(m+1,e,S,E,ex); pu(); } ll getv(int s, int e, int S, int E) { if (e<S||E<s) return 0; if (S<=s&&e<=E) { return val; } int m = (s+e)>>1; pd(); ll res = (l -> getv(s,m,S,E) + r -> getv(m+1,e,S,E))%MOD; pu(); return res; } } *head; int n, m; vector<int> comp; pii arr[200100]; bool cmpi(pii a, pii b) { return a.second<b.second||(a.second==b.second&&a.first<b.first); } int main() { int i; scanf("%d%d",&n,&m); comp.push_back(1); comp.push_back(n); for (i=1;i<=m+10;i++) po[i] = (po[i-1]*2)%MOD; for (i=0;i<m;i++) { scanf("%d%d",&arr[i].first,&arr[i].second); comp.push_back(arr[i].first); comp.push_back(arr[i].second); } sort(comp.begin(),comp.end()); comp.erase(unique(comp.begin(),comp.end()),comp.end()); n = (int)comp.size()-1; for (i=0;i<m;i++) { arr[i].first = lower_bound(comp.begin(),comp.end(),arr[i].first)-comp.begin(); arr[i].second = lower_bound(comp.begin(),comp.end(),arr[i].second)-comp.begin(); } sort(arr,arr+m,cmpi); head = new node(); head->init(0,n); head->upd(0,n,0,1); for (i=0;i<m;i++) { head->upd(0,n,arr[i].second,head->getv(0,n,arr[i].first,arr[i].second)); if (arr[i].first>0) head->upde(0,n,0,arr[i].first-1,1); } printf("%lld\n",head->getv(0,n,n,n)); return 0; }

Compilation message (stderr)

rail.cpp: In function 'int main()':
rail.cpp:91:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&n,&m);
                     ^
rail.cpp:96:45: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d",&arr[i].first,&arr[i].second);
                                             ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...