1. 程式人生 > 其它 >GDUT2020新生賽——解題報告

GDUT2020新生賽——解題報告

技術標籤:雜記演算法

比賽連結

https://ac.nowcoder.com/acm/contest/9692#question

A題——肥豬的鋼琴床

一道挺不錯的dp+結論題。

首先最終的字串的形式肯定是0...01...10...0這種,分為三個部分,第一部分的全0,中間部分的全1,最後一部分的全0。

我們定義狀態dp[i][1/2/3]表示第i個字元屬於第幾個部分時最少需要刪除的字元數量。

狀態轉移方程:

dp[i][1]=dp[i-1][1]+(s[i]=='1')

當第i個字元屬於第一部分時,第i-1個字元肯定也是第一部分。

dp[i][2]=min(dp[i-1][1],dp[i-1][2])+(s[i]=='0')

當第i個字元屬於第二部分時,第i-1個字元要麼是第一部分,要麼是第二部分。

dp[i][3]=min(dp[i-1][2],dp[i-1][3])+(s[i]=='1')

當第i個字元屬於第三部分時,第i-1個字元要麼是第二部分,要麼是第三部分。

最終的答案就是第n個字元的三種狀態的最小值。

#include <bits/stdc++.h>
#define PI atan(1.0)*4
#define rp(i,s,t) for ( int i = (s); i <= (t); i++)
#define RP(i,t,s) for ( int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
const int N = 1e6+7;
char s[N];
int dp[N][4];
void solve(){
    int n=read();
    scanf("%s",s+1);
    rp(i,1,n){
        dp[i][1]=dp[i-1][1]+(s[i]=='1');
        dp[i][2]=min(dp[i-1][1],dp[i-1][2])+(s[i]=='0');
        dp[i][3]=min(dp[i-1][2],dp[i-1][3])+(s[i]=='1');
    }
    cout<<min(dp[n][1],min(dp[n][2],dp[n][3]))<<endl;
}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();

    int T=1;
    while(T--) solve();

    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}

B題——拯救小a

簽到題,簡單的字元處理。

#include <bits/stdc++.h>
#define PI atan(1.0)*4
#define rp(i,s,t) for ( int i = (s); i <= (t); i++)
#define RP(i,t,s) for ( int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
const int N = 1e5+7;
char s[N];
void solve(){
    int cnt=0;
    while(~scanf("%s",s)){
        int len=strlen(s);
        if(len==1&&s[0]=='.') break;
        rp(i,0,len-1) if(s[i]=='a') cnt++;
    }
    cout<<cnt<<endl;


}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();

    solve();

    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}

C題——母牛的俄羅斯輪盤賭

規律題,手推或者打表出來1-10的答案可以發現,當且僅當n%5==2或者n%5==0是為Cow。

具體解釋:顯然能開出第n-1槍的是勝者,易證得開出第k槍的玩家一定能開出第k+5槍,算出n<=5的答案即可。

#include <bits/stdc++.h>
#define PI atan(1.0)*4
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define RP(i,t,s) for (register int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
void solve(){
    int n=read();
    if(n%5==0||n%5==2) puts("Cow");
    else puts("Pig");
}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();

    int T=read();
    while(T--) solve();

    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}

D題——中學數學題

答案就是列舉1~n中每個數,對每個數進行唯一分解定理後,該數能夠整除k的最大次方的和。

#include <bits/stdc++.h>
#define PI atan(1.0)*4
#define rp(i,s,t) for ( int i = (s); i <= (t); i++)
#define RP(i,t,s) for ( int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
const int N = 1e5+7;
char s[N];
void solve(){
    int n=read(),k=read();
    int cnt=0;
    rp(i,k,n){
        int j=i;
        if(i%k==0){
            while(i%k==0) i/=k,cnt++;
        }
        i=j;
    }
    cout<<cnt<<endl;
}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();
    int T=read();
    while(T--)solve();
    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}

E題——列舉求和

這個公式在莫比烏斯反演題型裡面經常出現,算是比較經典。

答案就是(n/k)*(m/k),也比較好理解。

#include <bits/stdc++.h>
#define PI atan(1.0)*4
#define rp(i,s,t) for ( int i = (s); i <= (t); i++)
#define RP(i,t,s) for ( int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
const int N = 1e5+7;
char s[N];
void solve(){
    int n=read(),m=read(),k=read();

    cout<<1ll*(m/k)*(n/k)<<endl;
}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();
    int T=read();
    while(T--)solve();
    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}

F題——合併石子

比較有意思的一道題,也比較巧妙,解題的方法也很多。

介紹一個比較巧妙的方法:利用期望計算。

消耗的體力總和=合併的所有情況數*\sum_{i=1}^{n-1}第i次合併時任選兩堆石子的期望和。

n堆石子合併的情況總數為(n-1)!,第i次合併任選兩堆石子的期望和是2*n/(n-i+1)

故最終的答案就是(n-1)!\sum_{i=2}^{n}\frac{2n}{i}

這個思路比較巧妙,不是特別好想。

#include <bits/stdc++.h>
#define PI atan(1.0)*4
#define rp(i,s,t) for ( int i = (s); i <= (t); i++)
#define RP(i,t,s) for ( int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
const ll mod = 1e9+7;
ll quickPow(ll a, ll b, ll mod) {
    ll ans = 1;
    while(b) {
        if(b&1) ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ans;
}
void solve(){
    int n=read();
    if(n==1){
        puts("0");
        return ;
    }
    ll res=1;
    rp(i,1,n-1) res=(res*i)%mod;
    ll ans=0;
    rp(i,2,n) ans=(ans+1ll*2*n%mod*quickPow(i,mod-2,mod)%mod)%mod;
    cout<<res*ans%mod<<endl;
}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    // freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();

    int T=1;
    while(T--) solve();

    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}

G題——排解憂傷

無論入場順序怎麼安排最終的怒氣和都是一樣的(有點類似於2020年ccpcWannaflyDay7的石子合併那一題),所以就從前往後安排就行了。

#include <bits/stdc++.h>
#define PI 3.1415926535
#define rp(i,s,t) for ( int i = (s); i <= (t); i++)
#define RP(i,t,s) for ( int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
const int N = 1e5+7;
int a[N];
void solve(){
    int n=read(),m=read();  
    rp(i,1,m) a[i]=read();
    sort(a+1,a+1+m);
    ll ans=0;
    int cur;
    rp(i,1,m){
        if(i==1) cur=a[i];
        else{
            cur++;
            if(cur<a[i]) cur=a[i];
            else ans+=cur-a[i];
        }
    } 
    if(cur>n) cout<<-1<<endl;
    else cout<<ans<<endl;
}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();
    solve();
    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}

I題——歷史

簽到題,不多說。

#include <bits/stdc++.h>
#define PI atan(1.0)*4
#define rp(i,s,t) for ( int i = (s); i <= (t); i++)
#define RP(i,t,s) for ( int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
const int N = 1e5+7;
char s[N];
void solve(){
    printf("The Chinese teams has won %d championships\n",4);

}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();
    solve();
    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}

K題——很基礎的模擬題

看範圍直接vector模擬就行了,如果資料範圍到1e5的話就需要用無旋treap或者splay維護了。

#include <bits/stdc++.h>
#define PI atan(1.0)*4
#define rp(i,s,t) for ( int i = (s); i <= (t); i++)
#define RP(i,t,s) for ( int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
const int N = 1e5+7;
char s[N];
void solve(){
    int n=read(),q=read();
    vector<int> v;v.clear();
    rp(i,1,n){
        int x=read();
        v.p_b(x);
    }
    while(q--){
        int op=read(),x=read();
        x--;
        if(op==1){
            vector<int> vv;vv.clear();
            int len=v.size();
            rp(i,0,x-1) vv.p_b(v[i]);
            rp(i,x+1,len-1) vv.p_b(v[i]);
            v.clear();
            int L=vv.size();
            rp(i,0,L-1) v.p_b(vv[i]);
        }
        else if(op==2){
            int y=read();
            vector<int> vv;vv.clear();
            int len=v.size();
            rp(i,0,x-1) vv.p_b(v[i]);
            vv.p_b(y);
            rp(i,x,len-1) vv.p_b(v[i]);
            v.clear();
            int L=vv.size();
            rp(i,0,L-1) v.p_b(vv[i]);
        }
        else{
            vector<int> vv;vv.clear();
            int len=v.size();
            rp(i,0,x-1) vv.p_b(v[i]);
            int cur=v[x];
            int id=-1;
            rp(i,x+1,len-1){
                if(v[i]==v[x]) cur+=v[x];
                else{
                    id=i;
                    break;
                }
            }
            vv.p_b(cur);
            if(id<=len-1&&id!=-1) rp(i,id,len-1) vv.p_b(v[i]);
            v.clear();
            int L=vv.size();
            rp(i,0,L-1) v.p_b(vv[i]);
        }
        int len=v.size();
        rp(i,0,len-1) printf("%d%s",v[i],i==len-1?"\n":" ");
    }
}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();
    solve();
    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}#include <bits/stdc++.h>
#define PI atan(1.0)*4
#define rp(i,s,t) for ( int i = (s); i <= (t); i++)
#define RP(i,t,s) for ( int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
const int N = 1e5+7;
char s[N];
void solve(){
    int n=read(),q=read();
    vector<int> v;v.clear();
    rp(i,1,n){
        int x=read();
        v.p_b(x);
    }
    while(q--){
        int op=read(),x=read();
        x--;
        if(op==1){
            vector<int> vv;vv.clear();
            int len=v.size();
            rp(i,0,x-1) vv.p_b(v[i]);
            rp(i,x+1,len-1) vv.p_b(v[i]);
            v.clear();
            int L=vv.size();
            rp(i,0,L-1) v.p_b(vv[i]);
        }
        else if(op==2){
            int y=read();
            vector<int> vv;vv.clear();
            int len=v.size();
            rp(i,0,x-1) vv.p_b(v[i]);
            vv.p_b(y);
            rp(i,x,len-1) vv.p_b(v[i]);
            v.clear();
            int L=vv.size();
            rp(i,0,L-1) v.p_b(vv[i]);
        }
        else{
            vector<int> vv;vv.clear();
            int len=v.size();
            rp(i,0,x-1) vv.p_b(v[i]);
            int cur=v[x];
            int id=-1;
            rp(i,x+1,len-1){
                if(v[i]==v[x]) cur+=v[x];
                else{
                    id=i;
                    break;
                }
            }
            vv.p_b(cur);
            if(id<=len-1&&id!=-1) rp(i,id,len-1) vv.p_b(v[i]);
            v.clear();
            int L=vv.size();
            rp(i,0,L-1) v.p_b(vv[i]);
        }
        int len=v.size();
        rp(i,0,len-1) printf("%d%s",v[i],i==len-1?"\n":" ");
    }
}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();
    solve();
    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}

L題——母牛上柱

比較經典的計算幾何題,注意兩種路徑取最小值就行。

#include <bits/stdc++.h>
#define PI 3.1415926535
#define rp(i,s,t) for ( int i = (s); i <= (t); i++)
#define RP(i,t,s) for ( int i = (t); i >= (s); i--)
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define m_p make_pair
#define p_b push_back
#define ins insert
#define era erase
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define dg if(debug)
#define outval(a) cout << "Debuging...|" << #a << ": " << a << "\n";
using namespace std;
int debug = 0;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}
inline int read(){
    int s=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s*f;
}
const int N = 1e5+7;
void solve(){
    int alp=read(),belt=read(),R=read(),H=read();
    double ans=min(2.0*PI*R*((1.0*abs(alp-belt))/360.0),2.0*PI*R*(1.0*(360-abs(alp-belt))/360.0));
    double res=H*H+ans*ans;
    printf("%.2f\n",res);
}
int main(){
    //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    //debug = 1;
#endif
    time_t beg, end;
    //if(debug) beg = clock();
    int T=read();
    while(T--) solve();
    /*
    if(debug) {
        end = clock();
        printf("time:%.2fs\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
    }
    */
    return 0;
}