답안 #635179

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
635179 2022-08-25T15:26:41 Z Yahia_Emara Baloni (COCI15_baloni) C++17
100 / 100
981 ms 106444 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
#define ordered_set tree<pair<lng,lng>,null_type,less<pair<lng,lng>>,rb_tree_tag,tree_order_statistics_node_update>
#define ordered_multiset tree<double,null_type,less<double>,rb_tree_tag,tree_order_statistics_node_update>
#define rtr return 0
#define lng long long
#define double long double
#define endl "\n"
#define pb push_back
#define cmbntrcs fact[0]=1;for(int i=1;i<INF;i++){fact[i]=mul(i,fact[i-1]);}inv[INF-1]=mod_inv(fact[INF-1]);for(int i=INF-2;i>=0;i--){inv[i]=mul(inv[i+1],i+1);}
///#pragma GCC optimize(Ofast,unroll-all-loops)
const int INF=1e6+7,SZ=3e5+7,MSZ=1e5+3,MAXA=6e5+7;
int MOD=998244353;
int add(int x,int y){int z=x+y;if(z>=MOD){z-=MOD;}return z;}
int sub(int x,int y){int z=x-y;if(z<0){z+=MOD;}return z;}
int mul(int x,int y){return(x*1ll*y)%MOD;}
int pwr(int a,lng b)
{
 int rs=1;
 while(b>0){if(b&1){rs=mul(rs,a);}a=mul(a,a);b>>=1;}
 return rs;
}
int mod_inv(int a){return pwr(a,MOD-2);}
int fact[INF],inv[INF];
int nCr(int n,int r){if(r>n||r<0||n<0){return 0;}return mul(fact[n],mul(inv[r],inv[n-r]));}
int nPr(int n,int r){if(r>n||r<0||n<0){return 0;}return mul(fact[n],inv[n-r]);}
int nPrvc(vector<int>r)
{
 int den=1,n=0;
 for(int i=0;i<r.size();i++){den=mul(den,inv[r[i]]);n+=r[i];}
 return mul(fact[n],den);
}
int sb(int s,int b){if(s<0||b<0){return 0;}return nCr(s+b-1,s);}
int prfx(int i,int j){if(i<0||j<0){return 0;}return nCr(i+j,i);}
int nCrL(int x,int y)
{
 int rt=1;for(int i=x;i>x-y;i--){rt=mul(rt,i);}
 int dn=1;for(int i=1;i<=y;i++){dn=mul(dn,i);}
 return mul(rt,mod_inv(dn));
}
lng lcm(lng x,lng y){return((x/__gcd(x,y))*y);}
lng trig(lng x){return x*(x+1)/2;}
lng pent(lng x){return(x*((3*x)-1))/2;}
lng sigma(lng x,lng y){return trig(y)-trig(x-1);}
pair<double,double>quad(double a,double b,double c)
{
 double disc=(b*b)-(4*a*c);
 if(disc<0){return{-1e16,-1e16};}
 return{(sqrt(disc)-b)/(2*a),-(sqrt(disc)+b)/(2*a)};
}
double sigma_rev(double x){return quad(1,1,-2*x).first;}
lng cldv(lng a,lng b){return(a+b-1)/b;}
lng fp(lng a,lng b)
{
 lng rs=1;
 while(b>0){if(b&1){rs*=a;}a*=a;b>>=1;}
 return rs;
}
struct mtrx
{
 lng nx,mx;vector<vector<lng>>bd;
 void bld(vector<vector<lng>>obd){nx=obd.size(),mx=obd[0].size();bd=obd;}
 void outm(){for(lng i=0;i<nx;i++){for(lng j=0;j<mx;j++){cout << bd[i][j] << ' ';}cout << endl;}}
};
mtrx idnt(lng n)
{
 vector<vector<lng>>v;v.resize(n);
 for(lng i=0;i<n;i++){v[i].assign(n,0);v[i][i]=1;}
 return{n,n,v};
}
mtrx mulm(mtrx a,mtrx b)
{
 if(a.mx!=b.nx){return{1,1,{{0}}};}
 vector<vector<lng>>v;v.resize(a.nx);
 for(lng i=0;i<a.nx;i++)
 {
  v[i].resize(b.mx);
  for(lng j=0;j<b.mx;j++)
  {
   lng s=0;
   for(lng x=0;x<a.mx;x++)
   {
    s+=a.bd[i][x]*b.bd[x][j];
    s%=MOD;
   }
   v[i][j]=s;
  }
 }
 mtrx ret;ret.bld(v);
 return ret;
}
mtrx fpm(mtrx a,lng b)
{
 if(b==0){return idnt(a.nx);}
 mtrx ret=fpm(a,b/2);ret=mulm(ret,ret);
 if(b%2){ret=mulm(ret,a);}
 return ret;
}
lng rndm(lng a,lng b){return a+rng()%((b+1)-a);}
struct dsu
{
 vector<lng>p,sz;
 void init(lng n)
 {
  p.resize(n+1);sz.assign(n+1,1);
  for(lng i=0;i<=n;i++){p[i]=i;}
  return;
 }
 lng get(lng a)
 {
  if(p[a]==a){return a;}
  return p[a]=get(p[a]);
 }
 void unn(lng x,lng y)
 {
  if(cnct(x,y)){return;}
  x=get(x);y=get(y);
  if(sz[x]>sz[y]){swap(x,y);}
  p[x]=y;sz[y]+=sz[x];return;
 }
 bool cnct(lng x,lng y){return get(x)==get(y);}
 lng siz(lng a){return sz[get(a)];}
};
lng n,c=0,vs[INF]{},a[INF];set<lng>st[INF];
int main()
{
 ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 cin >> n;
 for(lng i=0;i<n;i++){cin >> a[i];st[a[i]].insert(i);}
 for(lng i=0;i<n;i++)
 {
  if(vs[i]){continue;}
  c++;int x=a[i],ps=i;
  while(true)
  {
   vs[ps]=1;st[x].erase(st[x].find(ps));
   x--;if(st[x].empty()){break;}
   if(st[x].upper_bound(ps)==st[x].end()){break;}
   ps=*st[x].upper_bound(ps);
  }
 }
 cout << c;
 return 0;
}

Compilation message

baloni.cpp: In function 'int nPrvc(std::vector<int>)':
baloni.cpp:36:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |  for(int i=0;i<r.size();i++){den=mul(den,inv[r[i]]);n+=r[i];}
      |              ~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 47316 KB Output is correct
2 Correct 24 ms 47388 KB Output is correct
3 Correct 24 ms 47564 KB Output is correct
4 Correct 23 ms 47572 KB Output is correct
5 Correct 893 ms 100308 KB Output is correct
6 Correct 981 ms 106444 KB Output is correct
7 Correct 766 ms 95820 KB Output is correct
8 Correct 753 ms 95428 KB Output is correct
9 Correct 870 ms 98284 KB Output is correct
10 Correct 927 ms 100060 KB Output is correct