1. 程式人生 > >Codeforces 816B & 816C & 816D Karen and ......(不正經專場)

Codeforces 816B & 816C & 816D Karen and ......(不正經專場)

//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運算就好了,所以程式能夠更快。
這道題最主要的還是計算,手推公式,加油!