2016 ACM/ICPC Asia Regional Dalian Online

自己還是太菜,補題離不開題解。。。

但還是留個博客,萬一以后忘了。。。

1001?Different Circle Permutation

Polya定理,第一次遇見,學習了一下。不旋轉的時候可以得到 f[i]=f[i-1]+f[i-2] 斐波那契數列,旋轉后就可以通過burnside引理求解,循環節為 gcd(i,n)。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL mod=1e9+7;
 5 LL pow_mod(LL a,LL n){
 6     LL res=1,t=a%mod;
 7     while(n){
 8         if(n&1) res=(res*t)%mod;
 9         t=(t*t)%mod;
10         n/=2;
11     }
12     return res;
13 }
14 struct Mat{
15     LL a[2][2];
16     void init(){
17         a[0][0]=1;
18         a[1][0]=a[0][1]=1;
19         a[1][1]=0;
20     }
21 };
22 Mat operator *(Mat a,Mat b){
23     Mat c;
24     for(LL i=0;i<2;i++)
25     for(LL j=0;j<2;j++){
26         c.a[i][j]=0;
27         for(LL k=0;k<2;k++)
28             c.a[i][j]+=a.a[i][k]*b.a[k][j];
29             c.a[i][j]%=mod;
30     }
31     return c;
32 }
33 Mat operator ^(Mat p,LL k){
34     Mat ans; ans.init();
35     while(k){
36         if(k&1)
37             ans=ans*p;
38         k/=2;
39         p=p*p;
40     }
41     return ans;
42 }
43 LL fun(LL x){
44     Mat a; a.init();
45     Mat b;
46     b.a[0][0]=1;
47     b.a[0][1]=0;
48     b.a[1][0]=2;
49     b.a[1][1]=0;
50     a=a^(x-2);
51     if(x>1) b=a*b;
52     return b.a[0][0];
53 }
54 LL n;
55 LL euler(LL n){
56     LL ans=n;
57     for(LL i=2;i*i<=n;i++){
58         if(n%i==0){
59             ans-=ans/i;
60             while(n%i==0) n/=i;
61         }
62     }
63     if(n>1) ans-=ans/n;
64     return ans;
65 }
66 int main(){
67     while(~scanf("%lld",&n)){
68         if(n==1){
69             printf("%lld\n",2);
70             continue;
71         }
72         LL ans=0;
73         for(LL i=1;i*i<=n;i++){
74             if(n%i==0){
75                 ans+=fun(i)*euler(n/i)%mod;
76                 if(n/i!=i) ans+=fun(n/i)*euler(i)%mod;
77                 ans%=mod;
78             }
79         }
80         ans=ans*pow_mod(n,mod-2)%mod;
81         printf("%lld\n",ans);
82     }
83 
84     return 0;
85 }
Psong

1002?Different GCD Subarray Query

查詢區間內不同gcd個數,區間gcd可以ST表打出,并提前二分處理出每個點向右gcd下降的地方。查詢作為點對,以右端點大小排序,然后用樹狀數組處理。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 int n,q;
  5 int k[100005];
  6 
  7 int kk;
  8 struct node{
  9     int l,r,pos;
 10 } a[100005];
 11 bool cmp(node x,node y){
 12     return x.r<y.r;
 13 }
 14 
 15 int gcd(int x,int y){
 16     return y==0?x:gcd(y,x%y);
 17 }
 18 
 19 int lg[100005];
 20 int dp[100005][35];
 21 int RMQ_ST(int n){
 22     for(int i=1;i<=n;i++) lg[i]=(int)( log(1.0*i)/log(2.0) );
 23     for(int i=1;i<=n;i++) dp[i][0]=k[i];
 24     for(int j=1;(1<<j)<=n;j++){
 25         for(int i=1;i<=n-(1<<j)+1;i++){
 26             dp[i][j]=gcd( dp[i][j-1],dp[i+(1<<(j-1))][j-1] );
 27         }
 28     }
 29 }
 30 int find_gcd(int l,int r){
 31     int k=lg[r-l+1];
 32     return gcd(dp[l][k],dp[r-(1<<k)+1][k]);
 33 }
 34 
 35 int ans[100005];
 36 int c[100006];
 37 vector<int> vr[100005];
 38 
 39 int lowbit(int x){
 40     return x&(-x);
 41 }
 42 int add(int pos,int val){
 43     for(int i=pos;i<=n;i+=lowbit(i)){
 44         c[i]+=val;
 45     }
 46 }
 47 int sum(int pos){
 48     int res=0;
 49     for(int i=pos;i>0;i-=lowbit(i)){
 50         res+=c[i];
 51     }
 52     return res;
 53 }
 54 
 55 void init(){
 56     for(int i=1;i<=n;i++){
 57         vr[i].push_back(i);
 58         int tmp=k[i];
 59         int l=1,r=i;
 60         while(l<r){
 61             int L=l,R=r,flag=0;
 62             while(L<R){
 63                 int mid=(L+R+1)/2;
 64                 if(find_gcd(mid,i)<tmp) L=mid;
 65                 else if(find_gcd(l,i)<tmp) R=mid-1;
 66                 else { flag=1;break; }
 67             }
 68             if(!flag){
 69                 tmp=find_gcd(R,i);
 70                 vr[i].push_back(R);
 71             }
 72             else break;
 73             r=R;
 74         }
 75     }
 76 }
 77 int pos[1000006];
 78 void solve(){
 79     int R=0;
 80     for(int i=1;i<=q;i++){
 81         while(R<a[i].r){
 82             R++;
 83             for(int j=0;j<vr[R].size();j++){
 84                 int ll=vr[R][j];
 85                 int _gcd=find_gcd(ll,R);
 86                 if(pos[_gcd]==0) add(ll,1);
 87                 else if(pos[_gcd]<ll) add(ll,1),add(pos[_gcd],-1);
 88                 pos[_gcd]=max(pos[_gcd],ll);
 89             }
 90         }
 91         ans[a[i].pos]=sum(a[i].r)-sum(a[i].l-1);
 92     }
 93 }
 94 
 95 int main(){
 96     while(scanf("%d%d",&n,&q)!=EOF){
 97         for(int i=1;i<=n;i++) scanf("%d",&k[i]);
 98         RMQ_ST(n);
 99         init();
100         kk=sqrt(n);
101         for(int i=1;i<=q;i++){
102             scanf("%d%d",&a[i].l,&a[i].r);
103             a[i].pos=i;
104         }
105         sort(a+1,a+1+q,cmp);
106         memset(c,0,sizeof(c));
107         memset(pos,0,sizeof(pos));
108         //cout<<sum(1)<<endl;
109         solve();
110         for(int i=1;i<=q;i++) printf("%d\n",ans[i]);
111     }
112 
113 
114     return 0;
115 }
116 /*
117 9 10
118 3 3 4 4 4 6 6 6 9
119 */
Psong

1003?Alice's Adventure in Wonderland

1004?Number of Connected Subgraph

1005 Seats

1006?Football Games

排序后判斷前 i 個和不能少于 i*(i-1)/2 ,且總數為 n*(n-1)/2 即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int b[20005];
 5 int main(){
 6     int t;
 7     while(cin>>t){
 8         while(t--){
 9             cin>>n;
10             for(int i=1;i<=n;i++) cin>>b[i];
11             int sum=0,flag=0;
12             for(int i=1;i<=n;i++){
13                 sum+=b[i];
14                 if(sum<i*(i-1)) flag=1;
15             }
16             if(sum!=n*(n-1)) flag=1;
17             if(flag==0) cout<<'T'<<endl;
18             else cout<<'F'<<endl;
19         }
20     }
21 
22     return 0;
23 }
Psong

1007?Friends and Enemies

最多的情況為把所有人平均分成兩組,然后內部互為敵人,外部互為朋友即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 long long n,m;
 4 int main(){
 5     while(cin>>n>>m){
 6         if(m>=(n-n/2)*(n/2)) cout<<"T"<<endl;
 7         else cout<<"F"<<endl;
 8     }
 9 
10     return 0;
11 }
Psong

1008 Function

查詢區間最左邊的一個數向右取模后的結果,每次取模下降至少為一半,所以ST表打出最小值,然后對每個詢問依次二分出向右的第一個比當前值小的位置。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 int a[100005];
 5 int dp[100005][35];
 6 int lg[100005];
 7 void RMQ_ST(int n){
 8     for(int i=1;i<=n;i++) lg[i]=(int)(log(1.0*i)/log(2.0));
 9     for(int i=1;i<=n;i++) dp[i][0]=a[i];
10     for(int j=1;(1<<j)<=n;j++){
11         for(int i=1;i<=n-(1<<j)+1;i++){
12             dp[i][j]=min( dp[i][j-1],dp[i+(1<<(j-1))][j-1] );
13         }
14     }
15 }
16 int find_min(int l,int r){
17     int k=lg[r-l+1];
18     return min(dp[l][k],dp[r-(1<<k)+1][k]);
19 }
20 void solve(int l,int r){
21     int res=a[l];
22     int L=l+1,R=r;
23     while(l<r){
24         while(L<R){
25             int mid=(L+R)/2;
26             if(find_min(l+1,mid)<=res) R=mid;
27             else L=mid+1;
28         }
29         if(find_min(l+1,L)>res) L=R;
30         res%=a[L];
31         L++; R=r;
32         if(find_min(l+1,r)>res) break;
33     }
34     printf("%d\n",res);
35 }
36 int main(){
37     int t;
38     scanf("%d",&t);
39     while(t--){
40         scanf("%d",&n);
41         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
42         RMQ_ST(n);
43         scanf("%d",&m);
44         while(m--){
45             int l,r;
46             scanf("%d%d",&l,&r);
47             solve(l,r);
48         }
49     }
50 
51     return 0;
52 }
53 /*
54 6
55 18 30 15 8 6 4
56 */
Psong

1009?Sparse Graph

補圖最短路,用兩個set維護還沒有記錄的點,和與當前點相連的點。

#include <bits/stdc++.h>
using namespace std;
vector<int> g[200005];
int dis[200005];
int n,m,s;
int u,v;
void bfs(){queue<int> q; q.push(s);set<int> s1,s2;for(int i=1;i<=n;i++)if(i!=s) s1.insert(i);while(!q.empty()){int u=q.front(); q.pop();for(int i=0;i<g[u].size();i++){int v=g[u][i];if(s1.find(v)!=s1.end()){s1.erase(v);s2.insert(v);}}set<int>::iterator it=s1.begin();for(;it!=s1.end();it++){dis[(*it)]=dis[u]+1;q.push(*it);}swap(s1,s2);s2.clear();}vector<int> ans;for(int i=1;i<=n;i++)if(i!=s) ans.push_back(dis[i]);for(int i=0;i<ans.size();i++){if(i==0) printf("%d",ans[i]);else printf(" %d",ans[i]);}printf("\n");
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);memset(dis,-1,sizeof(dis));for(int i=1;i<=n;i++) g[i].clear();for(int i=1;i<=m;i++) {scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}scanf("%d",&s); dis[s]=0;bfs();}return 0;
}
/*
2
5 6
1 2
1 3
2 4
3 4
2 5
4 5
2
*/
Psong

1010 Weak Pair

離散化后dfs,用樹狀數組記錄每個數出現個數,然后直接計數,當處理完一個點的時候要把這個這個值刪除。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL n,k;
 5 LL root;
 6 LL a[100005];
 7 LL in[100005];
 8 vector<LL> g[100005];
 9 LL cnt;
10 LL c[500005];
11 LL lowbit(LL x){
12     return x&(-x);
13 }
14 void add(LL pos,LL val){
15     for(LL i=pos;i<=cnt;i+=lowbit(i)){
16         c[i]+=val;
17     }
18 }
19 LL sum(LL pos){
20     LL res=0;
21     for(LL i=pos;i>0;i-=lowbit(i)){
22         res+=c[i];
23     }
24     return res;
25 }
26 vector<LL> v;
27 LL getid(LL x){
28     return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
29 }
30 
31 LL ans;
32 void dfs(LL u){
33     LL id=getid(a[u]);
34     if(a[u]){
35         ans+=sum(getid(k/a[u]));
36         add(id,1);
37     }
38     else{
39         ans+=sum(cnt);
40         add(1,1);
41     }
42     for(LL i=0;i<g[u].size();i++){
43         dfs(g[u][i]);
44     }
45     if(a[u]) add(id,-1);
46     else add(1,-1);
47 }
48 int main(){
49     LL t;
50     scanf("%lld",&t);
51     while(t--){
52         v.clear(); v.push_back(0);
53         memset(c,0,sizeof(c));
54         memset(in,0,sizeof(in));
55         scanf("%lld%lld",&n,&k);
56         for(LL i=1;i<=n;i++){
57             g[i].clear();
58             scanf("%lld",&a[i]);
59             v.push_back(a[i]);
60             if(a[i]!=0) v.push_back(k/a[i]);
61         }
62         for(LL i=1;i<n;i++){
63             LL u,v;
64             scanf("%lld%lld",&u,&v);
65             g[u].push_back(v);
66             in[v]++;
67         }
68         sort(v.begin(),v.end());
69         v.erase(unique(v.begin(),v.end()),v.end());
70         cnt=v.size(); ans=0;
71         for(LL i=1;i<=n;i++){
72             if(in[i]==0) root=i;
73         }
74         dfs(root);
75         printf("%lld\n",ans);
76     }
77 
78 
79     return 0;
80 }
Psong

?

轉載于:https://www.cnblogs.com/N-Psong/p/7141906.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455229.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

tornado學習筆記day07-同步與異步

同步 概念 同步就是按部就班的依次執行我們的代碼 進階 但是有些情況我們有一些比較耗時的從操作,比如去別的地方拿點資源,去其他網站請求數據,去訪問數據庫,上傳文件等等,所以這里面優點瑕疵,有小編一一道來 比如這樣 本模塊的功能:<同步異步demo># 這個就相等于一個…

關鍵字: on

關鍵字: on 數據庫在通過連接兩張或多張表來返回記錄時&#xff0c;都會生成一張中間的臨時表&#xff0c;然后再將這張臨時表返回給用戶。 在使用left jion時&#xff0c;on和where條件的區別如下&#xff1a; 1、 on條件是在生成臨時表時使用的條件&#xff0c;它不管on中的條…

天融信安全接入客戶端_天融信提示您警惕物聯網設備Ripple20漏洞風險

近日&#xff0c;天融信阿爾法實驗室在JSOF實驗室發布的由Treck公司開發的TCP/IP軟件庫中獲取到一系列0day漏洞。JSOF實驗室發布的這批漏洞共計19個&#xff0c;被JSOF研究人員稱為"Ripple20"。受此軟件庫影響的產品數量估計超過數億&#xff0c;其中包括智能家居設備…

Service-Oriented Architecture,SOA(轉)

http://blog.csdn.net/WOOSHN/article/details/8036910 介紹&#xff1a; IT體系結構已非常成熟&#xff0c;它是一種成功處理典型IT問題的方法。體系結構中一個受到很大重視且相對較新的分支是面向服務的體系結構(SOA)。SOA經常被吹捧為企業用于解決應用程序靈活性和高維護成本…

tornado學習筆記day08-tornado中的異步

概述 應為epoll主要用來解決網絡的并發問題,所以tornado中的異步也是主要體現在網絡的IO異步上,即異步web請求 tornado.httpclient.AsyncHTTPClient tornado提供異步web請求客戶端,可以用來進行異步web請求, 這個客戶端和服務端是相對來說的,當tornado的Handler去其他位置去…

GreenSock (TweenMax) 動畫案例(二)

實現效果 動畫分解 1.燈光閃爍2.文字出現3.水流4.心電圖 知識點 1.AI(可盡情騷擾UI歐巴)2.SVG(了解基本的知識點)3.TweenMax(GreenSock)4.CSS animation 寫在前面 寫過第一篇文章后GreenSock (TweenMax) 動畫案例(一)再回頭看發現代碼太多&#xff0c;根本沒耐心去看完。所以每…

vue 用key拿對象value_利用 WeakMap 對 Vue 新建數組中的對象賦予 :key

需求在 Vue 中&#xff0c;對組件進行循環都需要加入key以便“就地復用”&#xff0c;可是在某些情況下&#xff0c;我們需要新建多個對象&#xff0c;而這些對象不是從后端獲取到的&#xff0c;而是前端生成的&#xff0c;沒有唯一值&#xff0c;且 Vue 目前版本只允許字符串&…

無限輪播圖片的實現原理

無限輪播圖相信是很多開發人員常用的一個功能&#xff0c;這里總結一下常用的兩種方式的實現原理 一、使用UIScrollview實現無限輪播用UIScrollView實現&#xff0c;在scrollView上添加3個UIImageView&#xff0c;分別用來顯示上一張圖片&#xff0c;當前顯示的圖片&#xff0c…

開啟 JM 的 trace 功能

[JM代碼] 開啟 JM 的 trace 功能本帖最后由 firstime 于 2009-6-15 11:16 AM 編輯 城里漢子說過&#xff1a; trace文件對分析碼流結構很有效。我說的是trace文件&#xff0c;不是一步一步跟蹤&#xff0c;就是編解碼同時生成的 trace_enc.txt 這個文件&#xff0c;里面對每個比…

kafka入門介紹(轉載)

Kafka作為一個分布式的流平臺&#xff0c;這到底意味著什么&#xff1f; 我們認為&#xff0c;一個流處理平臺具有三個關鍵能力&#xff1a; 發布和訂閱消息&#xff08;流&#xff09;&#xff0c;在這方面&#xff0c;它類似于一個消息隊列或企業消息系統。 以容錯的方式存儲…

Cmd Markdown 編輯閱讀器

歡迎使用 Cmd Markdown 編輯閱讀器 我們理解您需要更便捷更高效的工具記錄思想&#xff0c;整理筆記、知識&#xff0c;并將其中承載的價值傳播給他人&#xff0c;Cmd Markdown 是我們給出的答案 —— 我們為記錄思想和分享知識提供更專業的工具。 您可以使用 Cmd Markdown&…

關于在smarty中實現省市區三級聯動

剛開始接觸php&#xff0c;&#xff0c;其實對于一些比較深入的東西還不是很了解&#xff0c;就像是這次的省市區聯動&#xff0c;都是用三張表為基礎編碼的&#xff0c;原諒我的無知&#xff0c;謝謝。 接下來就是編碼部分了&#xff1a; <?php require(./smarty/Smarty.c…

Ubuntu GitLab CI Docker ASP.NET Core 2.0 自動化發布和部署(1)

相關博文&#xff1a; Ubuntu 簡單安裝和配置 GitLabUbuntu 簡單安裝 DockerUbuntu Docker 簡單安裝 GitLabUbuntu Docker 安裝和配置 GitLab CI 持續集成服務器版本 Ubuntu 16.04 LTS。 經過上面四篇博文中的相關安裝和配置&#xff0c;我們主要完成了兩個容器的創建和運行&am…

X264學習筆記(1)

X264學習筆記&#xff08;1&#xff09; X264編碼流程 參數的初始化 1.opt&#xff0c;param根據輸入的參數和標準的規定&#xff0c;進行初始化設置。 Opt的說明如下&#xff1a; Opt->hin用于給出讀入的yuv文件的指針地址 Opt->hout給出了輸出的文件的指針地址 Opt->…

python 數字轉化excel行列_Python實現excel的列名稱轉數字、26進制(A-Z)與10進制互相轉換...

Python實現excel的列名稱轉數字、26進制(A-Z)與10進制互相轉換sequence list( map( lambda x: chr( x ), range( ord( A ), ord( Z ) 1 ) ) )##-----字母轉數字(python實現 1-26A-Z, then AA-AZ)def ten2TwentySix(num):L []numnum-1; #實現從1對應Aif num > 25:while Tr…

錯誤提示:'……' is not assignable to Android.app.Activity Manifest XML

1 問題描述&#xff1a; 針對這段代碼&#xff1a; <activity android:name".fragament.fragment_bulter" /> <activity android:name".fragament.fragment_girl" /> <activity android:name".fragament.fragment_user" />…

關于Lambda和匿名內部類

先上代碼&#xff1a; //gcache(f)public <T,R> Function<T,R> cache(Function<T,R> f){final Map<T,R> cachenew HashMap<>();Function<T,R> gt->{if(cache.containsKey(t)){System.out.println("cached t:"t);return cache…

H26L encoder.cfg參數分析

H264 encoder.cfg參數分析 收藏 (1) 文件操作參數:#Files InputFile "silent.yuv" #輸入序列,YUV 4:2:0 StartFrame 0 # 從視頻流的第幾幀開始編碼 FramesToBeEncoded 30 #編碼圖象幀數,指明了除去 B幀后將要被編碼的幀數(應該再實驗一下&#x…

django-ckeditor表情包修改

一、版本 Django1.11django-ckeditor5.2.2 二、關鍵步驟 1.刪除舊的ckeditor靜態文件 所在目錄&#xff1a;項目目錄下的static文件夾下的ckditor文件夾 rm ckeditor -rf 原因&#xff1a;在安裝ckeditor后需要執行collectstatic命令&#xff0c;這個過程中的查找靜態文件會去…

python中最難的是什么_python什么的最難了

學的人很少的,如果你沒有學過編程,建議學c語言.因為python中文資料很少的.你可以先了解一下phthonpython的歷史python的創始人為guido van rossum。1989年圣誕節期間&#xff0c;在阿姆斯特丹&#xff0c;guido為了打發圣誕節的無趣&#xff0c;決心開發一個新的腳本解釋程序&a…