Codeforces 816B & 816C & 816D Karen and ......(不正經專場)
阿新 • • 發佈:2019-02-11
//B題程式碼
int ans[200050], st[200050], en[200050], c[200050];
int n,k,m;
pair <int, int> p[200050];
int main()
{
cin >> n >> k >> m;
for(int i=0;i<n;i++)
{
int a,b;
cin>>a>>b;
b++;
st[a]++;
en[b]++;
}
int cur = 0;
for(int i = 1 ; i <= 200000; i++)
{
cur += st[i] - en[i];
if(cur >= k)
c[i] = 1;
}
for(int i = 1; i <= 200001; i++)
ans[i] = ans[i - 1] + c[i - 1];
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
b++;
cout << ans[b] - ans[a] << endl;
}
return 0;
}
//C題程式碼
using namespace std;
const int maxn=105;
int n,m,a[maxn][maxn],b[maxn][maxn];
int r[maxn],c[maxn];
int ans=-1,mi;
bool jud1(int t)
{
for (int j=1;j<=m;j++)
{
b[1][j]-=t;
if(b[1][j]<0)
{
return true;
}
}
return false;
}
int jud2(int t)
{
for (int i=2;i<=n;i++)
{
int p=b[i][1]-b[1][1];
if (p<0)
return -1;
t+=p;
bool f=false;
for (int j=1;j<=m;j++)
{
b[i][j]-=p;
if(b[i][j]<0)
{
f=true;
break;
}
}
if (f)
return -1;
}
return t;
}
int jud3(int t)
{
for (int j=1;j<=m;j++)
{
for (int i=2;i<=n;i++)
if (b[i][j]!=b[i-1][j])
return -1;
t+=b[1][j];
}
return t;
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
cin>>a[i][j];
for (int t=0;t<=500;t++)
{
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
b[i][j]=a[i][j];
if(jud1(t))
continue;
int t1=jud2(t);
if(t1==-1)
continue;
t1=jud3(t1);
if(t1==-1)
continue;
if (ans==-1 || ans>t1)
{
ans=t1;
mi=t;
}
}
cout<<ans<<endl;
if(ans==-1)
return 0;
int t=mi,x=mi;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
b[i][j]=a[i][j];
for (int j=1;j<=m;j++)
b[1][j]-=t;
r[1]=t;
for (int i=2;i<=n;i++)
{
int p=b[i][1]-b[1][1];
r[i]=p;x+=p;
for (int j=1;j<=m;j++)
b[i][j]-=p;
}
for (int j=1;j<=m;j++)
c[j]=b[1][j];
for (int i=1;i<=n;i++)
for (int j=1;j<=r[i];j++)
cout<<"row "<<i<<endl;
for (int i=1;i<=m;i++)
for (int j=1;j<=c[i];j++)
cout<<"col "<<i<<endl;
return 0;
}
下面就是D啦,題目意思是這樣滴,Karen去考試,題目是n個數字,用楊輝三角的方法用加和減運算著n個數,第一個符號為加號,然後跟著減號,然後第二行,以此類推,直到算出最終的一個數。
一開始TLE的方法是這樣滴(雖然估計的時間複雜度並沒有超時,匪夷又所思),如果n是偶數,先化為奇數,其實這一步可以省去,但假如寫個函式的話到後面也挺實用的,化為奇數後特判在不在4以內,如果在直接輸出結果,不在就繼續往下做。
原本如果暴力的話時間複雜度是O(N^2)的,因為每一層只能消去一個數,無疑是非常慢的,所以我優化了一下,每一層消去四個數,也就是合併5個數,這樣速度就提高很多。
這樣的確是可以,但可能是因為vector的常數問題,仍然TLE,所以要在一些細節上下功夫(由於不想慢慢改,就重寫了一遍)
1.加號減號的轉換問題,原本是用兩個if來判斷正負,實則不用,只要用一個變數每次乘以-1就行了。
2.誰說要用vector了,其實兩個陣列就足夠,而且我們可以折半!原本的n我們不把它化成奇數,把它化成偶數,這樣,兩邊的符號完全相同,只要判斷最後的符號即可,然後把兩邊的x,y運算就好了,所以程式能夠更快。
這道題最主要的還是計算,手推公式,加油!