Submission #1049519

#TimeUsernameProblemLanguageResultExecution timeMemory
1049519Dennis_JasonSails (IOI07_sails)C++14
25 / 100
1062 ms6048 KiB
#include <bitset> #include <cmath> #include <functional> #include <algorithm> #include <numeric> #include <deque> #include <fstream> #include <iomanip> #include <iostream> #include <iterator> #include <limits> #include <list> #include <map> #include <unordered_map> #include <queue> #include <set> #include <stack> #include <string> #include <vector> #include <cstring> #include <climits> #define int long long #define pb push_back #define MOD 1000000007 #define NMAX 250001 #define nl '\n' #define INF 1000000007 #define pii1 pair<int, pair<int,int>> (1,(1,2)); #define pii pair<int,int> #define tpl tuple<int,int,int> using namespace std; ifstream fin("data.in"); ofstream fout("data.out"); /* --------------------DEMONSTRATION--------------------- 3-2 5-3 4-1 2-1 4-3 3-2 subtask 1:1<=n<=15; 5*(5+1)/2=10; 1+2+3+4+5=15 ------------------------END-------------------------- */ class segtree{ private: int n; vector<int>tree; public: void init(int sz) { n=sz; tree.resize(4*sz+1); } void update(int node,int st,int dr,int pos,int val) { if(st==dr) { tree[node]+=val; return; } int mid=(st+dr)/2; if(pos<=mid) update(2*node,st,mid,pos,val); else update(2*node+1,mid+1,dr,pos,val); tree[node]=tree[2*node]+tree[2*node+1]; } pii combine(pii a,pii b) { if(a.first<b.first) return a; if(a.first==b.first) { if (a.second < b.second) return a; else return b; } else return b; } pii query(int node,int st,int dr,int L,int R) { if(st>R || dr<L) return {INF,-1}; if(st==dr) { return {tree[node],st}; } int mid=(st+dr)/2; pii a=query(2*node,st,mid,L,R); pii b=query(2*node+1,mid+1,dr,L,R); return min(a,b); } void update(int pos,int val) { update(1,1,n,pos,val); } pii query(int L,int R) { return query(1,1,n,L,R); } }; int n,h,k; int max_h; vector<pii>v; void subtask1() { map<int,int>mp; for(int i=1;i<=max_h;++i) { mp[i]=0; } for(int i=1;i<=n;++i) { int maxi=v[i].first; int cnt=v[i].second; vector<int>aux; for(auto [x,y]:mp) { if(x>maxi) continue; aux.pb(x); } auto cmp=[&](int a,int b) { if(mp[a]==mp[b]) return a>b; return mp[a]<mp[b]; }; sort(aux.begin(),aux.end(),cmp); for(auto x:aux) { if(!cnt) break; cnt--; mp[x]++; } } int ans=0; for(int i=1;i<=max_h;++i) { // cout<<mp[i]-1<<" "; if(mp[i]) { mp[i]--; ans+=(mp[i]*(mp[i]+1))/2; } } cout<<ans; } segtree st; void subtask2() { st.init(max_h); int cnt=v[n].second; for(int i=v[n].first;i>=1 && cnt;--i) { st.update(i,1); cnt--; } // for(int i=1;i<=max_h;++i) // { // cout<<st.query(i,i).first<<nl; // } for(int i=n-1;i>=1;--i) { // cout<<i<<": "; vector<pii>interval; interval.pb({1,v[i].first}); for(int j=1;j<=v[i].second;++j) { // cout<<nl; pii mini={INF,INF}; for(auto [x,y]:interval) { // cout<<x<<" "<<y<<" "; mini=min(mini,st.query(x,y)); } st.update(mini.second,1); // cout<<mini.second<<" "; for(int i=0;i<interval.size();++i) { auto [x,y]=interval[i]; if(mini.second>=x && mini.second<=y) { if(mini.second-1>=1 && x<=mini.second-1) interval[i]={x,mini.second-1}; else interval[i]={0,0}; if(mini.second+1<=max_h && mini.second+1<=y) interval.pb({mini.second+1,y}); break; } } } // cout<<nl; } int ans=0; for(int i=1;i<=max_h;++i) { int aux=st.query(i,i).first; aux--; // cout<<aux<<" "; ans+=((aux*(aux+1))/2); } cout<<ans; } signed main() { cin>>n; v.resize(n+1); for(int i=1;i<=n;++i) { cin>>h>>k; v[i]={h,k}; max_h=max(max_h,h); } if(n<=15) { subtask1(); return 0; } else { subtask2(); } return 0; }

Compilation message (stderr)

sails.cpp: In function 'void subtask1()':
sails.cpp:131:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  131 |         for(auto [x,y]:mp)
      |                  ^
sails.cpp: In function 'void subtask2()':
sails.cpp:190:22: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  190 |             for(auto [x,y]:interval)
      |                      ^
sails.cpp:197:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  197 |            for(int i=0;i<interval.size();++i)
      |                        ~^~~~~~~~~~~~~~~~
sails.cpp:199:21: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  199 |                auto [x,y]=interval[i];
      |                     ^
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...