北京集訓DAY7
阿新 • • 發佈:2017-10-11
-i sed for 結果 putchar 優化 數字 har turn
1 /* 2 用到了容斥原理,加上1個數的個數,減去兩兩相交的個數,加上三三相交 的個數,減去四四相交的個數。。。。 3 想出正解,結果蜜汁20.。。。。 4 */ 5 #include<iostream> 6 #include<algorithm> 7 #include<cstdio> 8 #include<cstring> 9 #include<cmath> 10 #include<cstdlib> 11 using namespace std; 12 typedef long代碼long ll; 13 typedef long double ld; 14 typedef pair<int,int> pr; 15 const double pi=acos(-1); 16 #define rep(i,a,n) for(int i=a;i<=n;i++) 17 #define per(i,n,a) for(int i=n;i>=a;i--) 18 #define Rep(i,u) for(int i=head[u];i;i=Next[i]) 19 #define clr(a) memset(a,0,sizeof a) 20 #definepb push_back 21 #define mp make_pair 22 #define putk() putchar(‘ ‘) 23 ld eps=1e-9; 24 ll pp=1000000007; 25 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;} 26 ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);returnans;} 27 ll gcd(ll a,ll b){return (!b)?a:gcd(b,a%b);} 28 ll read(){ 29 ll ans=0; 30 char last=‘ ‘,ch=getchar(); 31 while(ch<‘0‘ || ch>‘9‘)last=ch,ch=getchar(); 32 while(ch>=‘0‘ && ch<=‘9‘)ans=ans*10+ch-‘0‘,ch=getchar(); 33 if(last==‘-‘)ans=-ans; 34 return ans; 35 } 36 void put(ll a){ 37 if(a<0)putchar(‘-‘),a=-a; 38 int top=0,q[20]; 39 while(a)q[++top]=a%10,a/=10; 40 top=max(top,1); 41 while(top--)putchar(‘0‘+q[top+1]); 42 } 43 //head 44 ll ans=0; 45 int n,m,a[25]; 46 ll Gcd(ll a,ll b){ 47 if(!b)return a; 48 return gcd(b,a%b); 49 } 50 void dfs(int dep,ll t,int flag){ 51 if(t>n)return; 52 if(dep==m+1){ 53 ans+=n/t*flag; 54 return; 55 } 56 dfs(dep+1,t,flag); 57 dfs(dep+1,t/Gcd(t,a[dep])*a[dep],-flag); 58 } 59 int main(){ 60 n=read(); 61 m=read(); 62 rep(i,1,m)a[i]=read(); 63 dfs(1,1,1); 64 cout<<ans<<endl; 65 return 0; 66 }
1 /* 2 51Nod 第k大的區間2 3 對於60%數據:我們需要對程序進行優化,枚舉左端點的時候,要固定右端 點。 4 可以再n^3內算出。根據插入排序,我們可以找出中位數找出 5 對於80%數據:一般求第k大,一般都是需要二分答案。我們二分中位數大於等於k有多少個,二分完中位數大於等於k個。 6 比如說: 7 A 1 2 3 4 5 k=3 8 B -1 -1 1 1 1 9 因為1,2是小於零,根君b數組進行判斷有多少個大於等於k個。我們二分答案,再暴力一下,可以拿到80% 10 對於100%數據,我們要拿前綴和s[r]進行判斷。我們要讓s[r]-s[l-1]>0,我們要求逆序對,我們統計順序對的個數,求逆序對是nlogn,總時間復雜度是nlognlogn 11 */ 12 #include<iostream> 13 #include<algorithm> 14 #include<cstdio> 15 #include<cstring> 16 #include<cmath> 17 #include<cstdlib> 18 using namespace std; 19 typedef long long ll; 20 typedef long double ld; 21 typedef pair<int,int> pr; 22 const double pi=acos(-1); 23 #define rep(i,a,n) for(int i=a;i<=n;i++) 24 #define per(i,n,a) for(int i=n;i>=a;i--) 25 #define Rep(i,u) for(int i=head[u];i;i=Next[i]) 26 #define clr(a) memset(a,0,sizeof a) 27 #define pb push_back 28 #define mp make_pair 29 #define fi first 30 #define sc second 31 ld eps=1e-9; 32 ll pp=1000000007; 33 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;} 34 ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;} 35 ll read(){ 36 ll ans=0; 37 char last=‘ ‘,ch=getchar(); 38 while(ch<‘0‘ || ch>‘9‘)last=ch,ch=getchar(); 39 while(ch>=‘0‘ && ch<=‘9‘)ans=ans*10+ch-‘0‘,ch=getchar(); 40 if(last==‘-‘)ans=-ans; 41 return ans; 42 } 43 //head 44 #define N 110000 45 int a[N],b[N],c[N],d[N],e[N],n,m; 46 ll k; 47 int lowbit(int x){ 48 return x&(-x); 49 } 50 int bin(int k){ 51 int l=1,r=m; 52 while(l<r){ 53 int mid=(l+r)/2; 54 if(k<=d[mid])r=mid; 55 else l=mid+1; 56 } 57 return l; 58 } 59 void add(int x){ 60 for(;x<=m;x+=lowbit(x))e[x]++; 61 } 62 int find(int x){ 63 int ans=0; 64 for(;x;x-=lowbit(x))ans+=e[x]; 65 return ans; 66 } 67 ll check(int k){ 68 c[0]=0; 69 rep(i,1,n)c[i]=c[i-1]+(a[i]>=k); 70 rep(i,0,n)c[i]=c[i]*2-i,d[i+1]=c[i]; 71 sort(d+1,d+n+2); 72 d[0]=1; 73 rep(i,2,n+1) 74 if(d[i]!=d[d[0]])d[++d[0]]=d[i]; 75 m=d[0]; 76 ll ans=0; 77 rep(i,0,n)c[i]=bin(c[i]); 78 rep(i,0,m)e[i]=0; 79 rep(i,0,n) 80 if(i&1)add(c[i]); 81 else ans+=find(c[i]-1); 82 rep(i,0,m)e[i]=0; 83 rep(i,0,n) 84 if((i&1)==0)add(c[i]); 85 else ans+=find(c[i]-1); 86 return ans; 87 } 88 int main(){ 89 n=read();k=read(); 90 rep(i,1,n)a[i]=read(),b[i]=a[i]; 91 sort(b+1,b+n+1); 92 b[0]=1; 93 rep(i,2,n) 94 if(b[i]!=b[b[0]])b[++b[0]]=b[i]; 95 int l=1,r=b[0]; 96 while(l<r){ 97 int mid=(l+r)/2+1; 98 ll tt=check(b[mid]); 99 if(tt==k){ 100 cout<<b[mid]<<endl; 101 return 0; 102 } 103 if(check(b[mid])>k)l=mid; 104 else r=mid-1; 105 } 106 cout<<b[l]<<endl; 107 return 0; 108 }代碼
1 /* 2 這還是51Nod 上的一道題,忘了叫啥了 3 對於60%數據,每一次排序只新增一個數字,我們可以進行插入排序,這樣我們可以n^3做這道題。 4 對於80%數據:首先我們來考慮一下,一個區間是5,k=4,那麽會被統計4次,這個數字被統計了多少次,說明有多少個數字小於他。一個數比他小,則會對這個數字多貢獻一下 5 我們把t變一下,比如說還有t2,那麽還有i2這一段比他小 6 Sum=i+i2 7 Sum*(n-j+1)*k。所以我們只需要求出比k小的下標有多少個。 8 我們可以暴力做 9 10 對於100%數據:我們每一次找到比他小的下標進行維護,我們可以那樹狀數組,線段樹甚至歸並排序求出。我們先求出下標總和 11 比如:10 100 1000 數據 12 1 2 3 下標 13 這樣我們可以那歸並排序進行維護即可。 14 */ 15 #include<iostream> 16 #include<algorithm> 17 #include<cstdio> 18 #include<cstring> 19 #include<cmath> 20 #include<cstdlib> 21 using namespace std; 22 typedef long long ll; 23 typedef long double ld; 24 typedef pair<int,int> pr; 25 const double pi=acos(-1); 26 #define rep(i,a,n) for(int i=a;i<=n;i++) 27 #define per(i,n,a) for(int i=n;i>=a;i--) 28 #define Rep(i,u) for(int i=head[u];i;i=Next[i]) 29 #define clr(a) memset(a,0,sizeof a) 30 #define pb push_back 31 #define mp make_pair 32 #define fi first 33 #define sc second 34 ld eps=1e-9; 35 ll pp=1000000007; 36 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;} 37 ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;} 38 ll read(){ 39 ll ans=0; 40 char last=‘ ‘,ch=getchar(); 41 while(ch<‘0‘ || ch>‘9‘)last=ch,ch=getchar(); 42 while(ch>=‘0‘ && ch<=‘9‘)ans=ans*10+ch-‘0‘,ch=getchar(); 43 if(last==‘-‘)ans=-ans; 44 return ans; 45 } 46 //head 47 #define N 1100000 48 pr a[N]; 49 int c1[N],c2[N],n; 50 ll A,B,C; 51 int lowbit(int x){return x&(-x);} 52 void add(int *c,int x,int w){ 53 c[0]+=w; 54 if(c[0]>=pp)c[0]-=pp; 55 for(;x<=n;x+=lowbit(x)){ 56 c[x]=c[x]+w; 57 if(c[x]>=pp)c[x]-=pp; 58 } 59 } 60 int find(int *c,int x){ 61 int ans=0; 62 for(;x;x-=lowbit(x)){ 63 ans+=c[x]; 64 if(ans>=pp)ans-=pp; 65 } 66 return ans; 67 } 68 int main(){ 69 cin>>n>>a[1].fi>>A>>B>>C; 70 a[1].sc=1; 71 rep(i,2,n){ 72 a[i].sc=i; 73 a[i].fi=(a[i-1].fi*A+B)%C; 74 } 75 sort(a+1,a+n+1); 76 ll ans=0; 77 rep(i,1,n){ 78 int t1=find(c1,a[i].sc); 79 int t2=c2[0]-find(c2,a[i].sc-1); 80 t2=(t2+pp)%pp; 81 int t3=(1ll*t1*(n-a[i].sc+1)+1ll*t2*a[i].sc)%pp; 82 t3=(t3+1ll*a[i].sc*(n-a[i].sc+1))%pp; 83 ans=(ans+1ll*t3*a[i].fi)%pp; 84 add(c1,a[i].sc,a[i].sc); 85 add(c2,a[i].sc,n-a[i].sc+1); 86 } 87 cout<<ans<<endl; 88 return 0; 89 }代碼
北京集訓DAY7