1. 程式人生 > >Atcoder AGC013 簡要題解

Atcoder AGC013 簡要題解

傳送門

Sorted Arrays

貪心到前面第一個非法位置轉移。

#include <bits/stdc++.h>
using namespace std;
 
const int RLEN=1<<18|1;
inline char nc() {
	static char ibuf[RLEN],*ib,*ob;
	(ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
	return (ib==ob) ? -1 : *ib++;
}
inline int rd() {
	char ch=nc(); int
i=0,f=1; while(!isdigit(ch)) {if(ch=='-') f=-1; ch=nc();} while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();} return i*f; } const int N=1e5+50; int n,a[N],p[N][2],f[N]; int main() { n=rd(); for(int i=1;i<=n;i++) a[i]=rd(); for(int i=1;i<=n;i++) { p[i][0]=p[i-1][0]; p[i]
[1]=p[i-1][1]; if(a[i]>a[i-1]) p[i][1]=i-1; if(a[i]<a[i-1]) p[i][0]=i-1; f[i]=f[min(p[i][0],p[i][1])]+1; } cout<<f[n]<<'\n'; }

Hamiltonish Path

隨便放一條邊在雙端佇列中,然後不斷向兩邊擴充套件。

#include <bits/stdc++.h>
using namespace std;
 
const int RLEN=1<<18|1;
inline char nc() {
	static
char ibuf[RLEN],*ib,*ob; (ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin)); return (ib==ob) ? -1 : *ib++; } inline int rd() { char ch=nc(); int i=0,f=1; while(!isdigit(ch)) {if(ch=='-')f=-1; ch=nc();} while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();} return i*f; } const int N=2e5+50; int n,m,inq[N]; vector <int> edge[N]; deque <int> q; inline void F(int x) {q.push_front(x); inq[x]=1;} inline void T(int x) {q.push_back(x); inq[x]=1;} inline bool CF(int x) { for(auto v:edge[x]) if(!inq[v]) {F(v); return true;} return false; } inline bool CT(int x) { for(auto v:edge[x]) if(!inq[v]) {T(v); return true;} return false; } int main() { n=rd(), m=rd(); for(int i=1;i<=m;i++) { int x=rd(), y=rd(); edge[x].push_back(y); edge[y].push_back(x); } for(int i=1;i<=n;i++) if(edge[i].size()) {F(i), T(edge[i].front()); break;} while(CF(q.front())); while(CT(q.back())); printf("%d\n",q.size()); for(auto v:q) printf("%d ",v); }

Ants on a Circle

最後螞蟻的位置是確定的,彼此的順序也是確定的。 每次有螞蟻經過00處排名會整體移動1。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
 
const int RLEN=1<<18|1;
inline char nc() {
	static char ibuf[RLEN],*ib,*ob;
	(ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
	return (ib==ob) ? -1 : *ib++;
}
inline int rd() {
	char ch=nc(); int i=0,f=1;
	while(!isdigit(ch)) {if(ch=='-') f=-1; ch=nc();}
	while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}
	return i*f;
}
 
const int N=1e5+50;
int n,cnt,L,T,a[N],b[N],w[N];
int main() {
	n=rd(), L=rd(), T=rd();
	for(int i=1;i<=n;i++) {
		a[i]=rd(), w[i]=(rd()==1 ? 1 : -1);
		b[i]=((a[i]+(LL)T*w[i])%L+L)%L;
		int dis=(w[i]>0 ? L-a[i] : a[i])+1;
		if(T>=dis) {
			cnt+=w[i]; int res=T-dis;
			cnt+=(res/L)*w[i];
			cnt=(cnt%n+n)%n;
		}
	} sort(b+1,b+n+1);
	for(int i=1;i<=n;i++) 
		printf("%d\n",b[(i+cnt-1)%n+1]);
}

Piling Up

考慮任意一個序列,他非法一定存在某個位置的字首超過了範圍。

那麼DP的時候記錄一下是否卡住過範圍,就可以不重不漏了。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
 
const int RLEN=1<<18|1;
inline char nc() {
	static char ibuf[RLEN],*ib,*ob;
	(ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
	return (ib==ob) ? -1 : *ib++;
}
inline int rd() {
	char ch=nc(); int i=0,f=1;
	while(!isdigit(ch)) {if(ch=='-') f=-1; ch=nc();}
	while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}
	return i*f;
}
 
const int N=3e3+50, mod=1e9+7;
inline void add(int &x,int y) {x=(x+y>=mod) ? (x+y-mod) : (x+y);}
int n,m,f[N][N][2];
 
int main() {
	n=rd(), m=rd();
	for(int i=0;i<=n;i++) f[0][i][i==0]=1;
	for(int i=1;i<=m;i++) {
		for(int j=0;j<=n;++j) {
			if(j) add(f[i][j][j==1],f[i-1][j][0]), add(f[i][j][1],f[i-1][j][1]);
			if(j) add(f[i][j-1][j==1],f[i-1][j][0]), add(f[i][j-1][1],f[i-1][j][1]);
			if(n-j) add(f[i][j][0],f[i-1][j][0]), add(f[i][j][1],f[i-1][j][1]);
			if(n-j) add(f[i][j+1][0],f[i-1][j][0]), add(f[i][j+1][1],f[i-1][j][1]);
		}
	}
	int ans=0;
	for(int i=0;i<=n;i++) add(ans,f[m][i][1]);
	cout<<ans<<'\n';
}

Placing Squares

把問題轉化為一個正方形裡面可以放兩個點,總共的方案數。

矩陣快速冪即可。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,x,y) for(int i=x;i<=y;i++)
 
const int RLEN=1<<18|1;
inline char nc() {
	static char ibuf[RLEN],*ib,*ob;
	(ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
	return (ib==ob) ? -1 : *ib++;
}
inline int rd() {
	char ch=nc(); int i=0,f=1;
	while(!isdigit(ch)) {if(ch=='-')f=-1; ch=nc();}
	while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch
            
           

相關推薦

Atcoder AGC013 簡要題解

傳送門 Sorted Arrays 貪心到前面第一個非法位置轉移。 #include <bits/stdc++.h> using namespace std; const int RLEN=1<<18|1; inline char n

Atcoder AGC018 簡要題解

傳送門 Coins 先轉化為一個點只有兩種屬性 x i

Atcoder AGC017 簡要題解

傳送門 Snuke and Spells 答案等於 n n n條線段

Atcoder AGC016 簡要題解

傳送門 +/- Rectangle 對於 ( x ,

Atcoder Yahoo Programming Contest 2019 簡要題解

ram yahoo 轉移 first put 表示 spa rec sub A-C 直接放代碼吧。 A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"

AtCoder Grand Contest 031 簡要題解

isp href uil 出現 mat false tor 每次 spa AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本質不同子序列的個數模\(10^9+7\)。

AGC002 簡要題解

傳遞 auto begin ati bit 檢查 code cin int A 分情況討論一下。。。 #include <bits/stdc++.h> using namespace std; int main() { int a, b; scanf

Codeforces Round #498 (Div. 3) 簡要題解

復雜 2個 problem val 要求 scan ces 結構 fine [比賽鏈接] https://codeforces.com/contest/1006 [題解] Problem A. Adjacent Replacements

模擬賽簡要題解與心得

子集 約數 lib 紀念 機會 分享圖片 printf 關心 stdin 目錄 模擬賽簡要題解與心得 T1 方格紙與直線 題解 T2 探險 題解 3.蘋果樹 題解 心得 模擬賽簡要題解與心得 最近我的心態炸了,寫此博客紀念調侃一下. T1 方格紙與直線 【題目描述】

AtCoder】ARC100 題解

cut swa std while 處理 方式 累加 endif matrix C - Linear Approximation 找出\(A_i - i\)的中位數作為\(b\)即可 題解 #include <iostream> #include <cst

AtCoder】ARC099題解

C - Minimization 每次操作必然包含一個1 列舉第一次操作的位置計算兩邊即可 程式碼 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #def

JXOI 2018 簡要題解

pro 編號 memset fin def bug esp names isdigit 「JXOI2018」遊戲 題意 可憐公司有 \(n\) 個辦公室,辦公室編號是 \(l\sim l+n-1\) ,可憐會事先制定一個順序,按照這個順序依次檢查辦公室。一開始的時候,所有辦

Tsinghua 2018 DSA PA2簡要題解

反正沒時間寫,先把簡要題解(嘴巴A題)都給他寫了記錄一下。   CST2018 2-1 Meteorites:   乘法版的石子合併,堆 + 高精度。   寫起來有點煩貌似。   CST2018 2-2 Circuit   首先是一個二進位制trie + 貪心,但是由於有間隔

SCOI2016 Day1 簡要題解

目錄 「SCOI2016」背單詞 題意 題解 程式碼 「SCOI2016」幸運數字 題意 題解 總結 程式碼 「SCOI2016」萌萌噠 題意 題解 總結 程式碼

[題解][Codeforces 1080A~1080F]Codeforces Round #524 簡要題解

引入 人生第一次 CF 也是難得的一次時間在下午的比賽 在讀題上浪費了好多時間,藥丸 因為不熟悉賽制, D 題不檢查就提交 結果 WA 了兩發 題目 洛谷 RemoteJudge A B C D E

簡要題解-圖論-搜尋-並查集-dp-樹形-拓撲-tarjan等等

attentions:對我而言非常好的一道題!最長路! 有幾個點 1、這道題轉化成最長路來求解,方法和最短路類似 2、但這道題是點有正權且只有負權邊,且路徑為單向!那麼精妙之處在於,可以將點權轉化為邊權!!! 3、由於題目中可能出現正環(和最短路相反

Codeforces Round #511 (Div. 1) 簡要題解

傳送門 Enlarge GCD 對於所有質數分開考慮,刪除質數的指數最小的那幾個數。 #include <bits/stdc++.h> using namespace std; const

「JOI 2018 Final」簡要題解

題目是LOJ2347-LOJ2351 「JOI 2018 Final」寒冬暖爐 貪心小水題。選最大的間隔即可。 #include <bits/stdc++.h> using namespace std; const int maxn = 100005; int n

Tsinghua 2018 DSA PA3簡要題解

CST2018 3-1-1 Sum (15%) 簡單的線段樹,單點修改,區間求和。 很簡單。   CST2018 3-1-2 Max (20%) 高階的線段樹。 維護區間最大和,區間和,左邊最大和,右邊最大和。 單點修改的時候一路吧區間都改了就好了。 求子段最大值也就判斷一下左右就好

JXOI 2017 簡要題解

題意 九條可憐手上有一個長度為 \(n\) 的整數數列 \(r_i\) ,她現在想要構造一個長度為 \(n\) 的,滿足如下條件的整數數列 \(A\) : \(1\leq A_i \leq r_i\) 。 對於任意 \(3 \leq i \leq n\) ,令 \(R\) 為 \(A_1\) 至 \(A_