{我是題解}

好玩ㄇ

Statistics

Who: Fatman 巧虎

Score: 400

Submissions: 17

1.

2.

Who: yitien 信田

Score: 200

Submissions: 7

3.

Who: fishball 魚丸

Score: 150

Submissions: 3

# Statistics

pA

1013 hPa

沒AC的都去面壁

Tag: I / O operators

Rating: Water

SUBTASK 1

\(x, y, z = 0\)

#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<0;
}

應該不會有人只想拿\(1\)分吧

SUBTASK 1

\(x, y, z = 0\)

#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<0;
}

應該不會有人只想拿\(1\)分吧

SUBTASK 其他

這沒比\(AC\)好寫

\(x = 0\)

\(y = 0\)

\(z = 0\)

直接\(AC\)吧

輸出\(x - y \times z\)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int x,y,z;
    cin>>x>>y>>z;
    cout<<x-y*z<<"\n";
}

pb

Acme Engineering is a full service software agency.

Tag: Implementation

Rating: Easy

SUBTASK 1

保證第1個字元為z且$$N = 1 $$且字串長度小於26

其實就是什麼都不輸出

\(O(1)\)

因為長度小於26一定拿不到第26個字元

20分欸超有性價比

所以才說要看測資範圍嘛

SUBTASK 2

$$N \le 20000 $$且保證每個字串長度皆大於等於26

\(O(N)\)

一直拿就好不管第一個字元是什麼一定拿的到

SUBTASK 2

$$N \le 20000 $$且保證每個字串長度皆大於等於26

順帶一提

你可以把s[0] - 'a'

就會得到要取第幾項了

SUBTASK 3

$$N \le 20000 $$

跟上個subtask只差在判能不能拿

也就是要

s.size() > s[0] - 'a'

\(O(N)\)

AC CODE

#include <iostream>
#include <string>
#include <vector>
using namespace std;
#define ll long long
int main(){
    int a;
    cin>>a;
    vector<char> op;
    for(ll i = 0; i < a; i++){
        string str;
        cin >> str;
        int x = int(str[0]-'a');
        if(str.size() > x){
            op.push_back(str[x]);
        }
        else{
            op.push_back(' ');
        }
    }
    for(ll i = 0; i < op.size(); i++){
        cout << op[i];
    }
}

WA CODE

奇人異code鑑賞

#include <iostream>
using namespace std;


// Main function
int main() {
 int n;
string s,a;
while(cin>>s){
  if(s.length()>s[0]-'a'){
a=a+a[s[0]-'a'];
}else{
a=a+" ";
}
}
cout<<a;
  return 0;
}

BY YCY

雖然你後面AC了但是你這筆沒有cin>>n;

你還有兩筆CE欸

pC

我的PC爆了

哈哈

Tag: Greedy

Rating: Hard

SUBTASK 1

\(a_i \ge 0\)

啊既然這樣就每個元素切一塊啊

\(O(N)\)

10 P 居然不拿

#include <bits/stdc++.h>
#define pii pair<int, int>
#define int long long
#define ff first
#define ss second
using namespace std;

signed main(){
	ios_base::sync_with_stdio(false);cin.tie(0);
	int n, k;cin>>n>>k;
	int ans=0;
	for(int i=1; i<=n; i++){
		int a;cin>>a;
		ans+=a*i;
	}
	if(ans>=k) cout<<"safewilly";
	else cout<<"willygonemad";
}

SUBTASK 2

\(n \le 10\)

窮舉每個斷點

\(O(2 ^ N)\)

13 P 我寫這個差點往生 完全沒必要

#include <bits/stdc++.h>
#define pii pair<int, int>
#define int long long
#define ff first
#define ss second
using namespace std;
int arr[20]={
	0
};
int maxi=INT64_MIN;
int val[20];
int n;


void solve(){
	int start=1;int cnt=0;int ans=0;
	for(int i=0; i<n; i++){
		cnt+=val[i];
		if(arr[i]){
			ans+=cnt*start;
			start++;
			cnt=0;
		}
	}
	ans+=cnt*start;
	maxi=max(maxi, ans);
}

void recur(int place){
	if(place==n) {
		solve();
		return;
	}
	arr[place]=0;
	recur(place+1);
	arr[place]=1;
	recur(place+1);
}


signed main(){
	ios_base::sync_with_stdio(false);cin.tie(0);
	int k;cin>>n>>k;
	for(int i=0; i<n; i++) cin>>val[i];
	recur(0);
	if(maxi>=k)cout<<"safewilly";
	else cout<<"willygonemad";
}

SUBTASK 3

\(n \le 1000\)

好問題 你想得到 \(O(n ^ 2)\) 的解嗎

理論上魚切的假解被我卡掉的話應該只能過這個

雖然他是\(O(NlogN)\)

但我不知道他在寫甚麼

就不放了

SUBTASK 4

\(n \le 2000000\)

要怎麼Greedy呢

考慮將切段的想法轉換一下

因為每次乘的倍率只是加一

所以若新切一個區間

相當於將從 \(a_i\) 到 \(a_n\) 的東西都拿一遍

怎麼做呢

建立一個後綴和陣列 對於每個 > 0 的項都拿一遍

\(AC\)

實作超簡單的ㄅ

\(O(N)\)

AC CODE

# PRESENTING CODE
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define ff first
#define ss second

signed main(){
	ios_base::sync_with_stdio(false);cin.tie(0);
	int n, k;cin>>n>>k;
	vector<int> li(n);
	for(int i=0; i<n; i++) cin>>li[i];
	for(int i=n-2; i>=0; i--) li[i]+=li[i+1];
	int ans=li[0];
	for(int i=1; i<n; i++) ans+=(li[i]>0?li[i]:0);
	cout<<(ans>=k?"safewilly":"willygonemad");
}

pD

Priority Deque

夠裸了吧

Tag: STL

Rating: Medium

SUBTASK 1

1 x 的x只有1與2

紀錄1 2各有幾個

\(O(N)\)

7P

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define ff first
#define ss second

signed main(){
	ios_base::sync_with_stdio(false);cin.tie(0);
	int q;cin>>q;
	int one=0, two=0;
	while(q--){
		int det;cin>>det;
		if(det==1){
			int num;cin>>num;
			if(num==1)one++;
			else two++;
		}else{
			int op;cin>>op;
			if(op){
				if(two){
					cout<<2<<'\n';
					two--;
				}else{
					cout<<1<<'\n';
					one--;
				}
			}else{
				if(one){
					cout<<1<<'\n';
					one--;
				}else{
					cout<<2<<'\n';
					two--;
				}
			}
		}
	}
}

SUBTASK 2

僅有 1 x 與 2 0 兩種操作

你就開一個priority_queue啊

\(O(NlogN)\)

10P

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define ff first
#define ss second

signed main(){
	ios_base::sync_with_stdio(false);cin.tie(0);
	int q;cin>>q;
	priority_queue<int, vector<int>, greater<int>> pq;
	while(q--){
		int det;cin>>det;
		if(det==1){
			int num;cin>>num;
			pq.push(num);
		}else{
			int num;cin>>num;
			cout<<pq.top()<<'\n';
			pq.pop();
		}
	}

}

SUBTASK 3

僅有 1 x 與 2 1 兩種操作

你就開一個priority_queue啊

\(O(NlogN)\)

10P

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define ff first
#define ss second

signed main(){
	ios_base::sync_with_stdio(false);cin.tie(0);
	int q;cin>>q;
	priority_queue<int, vector<int>, less<int>> pq;
	while(q--){
		int det;cin>>det;
		if(det==1){
			int num;cin>>num;
			pq.push(num);
		}else{
			int num;cin>>num;
			cout<<pq.top()<<'\n';
			pq.pop();
		}
	}

}

SUBTASK 4

\( 0 \lt x \lt 1000 , 0 \lt Q \lt 1000  \)

開一個陣列紀錄每個值

每次Query爆搜一遍

\(O(xQ)\)

7P

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define ff first
#define ss second

signed main(){
	ios_base::sync_with_stdio(false);cin.tie(0);
	int q;cin>>q;
	vector<int> sz(1007, 0);
	while(q--){
		int det;cin>>det;
		if(det==1){
			int num;cin>>num;
			sz[num]++;
		}else{
			int op;cin>>op;
			if(op){
				int ind=1000;
				while(true){
					if(sz[ind]) break;
					ind--;
				}
				cout<<ind<<'\n';
				sz[ind]--;
			}else{
				int ind=0;
				while(true){
					if(sz[ind]) break;
					ind++;
				}
				cout<<ind<<'\n';
				sz[ind]--;
			}
		}
	}

}

AC

開一個multiset

因為set會自動排序

每次尋找其頭或尾即可得到他的最大或最小值

刪除則是先find找到那個指標後再刪除

因為multiset刪除若指定一個數字會刪掉那個數字的所有元素

\(O(NlogN)\)

#include<set>
#include<iostream>
using std::multiset,std::cin,std::cout;

int main(){
	std::ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	multiset<int> mset;
	multiset<int>::iterator it;
	int q,x;
	cin>>q;
	for(char m;q--;){
		cin>>m;
		if(m=='1'){
			cin>>x;
			mset.insert(x);
		}
		else {
			cin>>m;
			if(m=='0'){
				it=mset.begin();
				cout<<*it<<'\n';
				mset.erase(it);
			}
			else{
				it=mset.end();
				it--;
				cout<<*it<<'\n';
				mset.erase(it);
			}
		}
	}
}

pe

這題可以喇分

subtask

這題可以喇分

m = 0

subtask: 

#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<0;
}
# PRESENTING CODE
m = 0

subtask

這題可以喇分

n = 0

恭喜餘切獲得1分

subtask: 

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    for(int a,b,i=0;i<n;i++) cin>>a>>b;
    int m;cin>>m;
    cout<<m;
}
# PRESENTING CODE
m = 0

subtask

忘記開long long

0 \le t_i, r_i \lt 2 ^ {31} (0 \le i \lt n) \\ 0 \le s_j \le e_j \lt 2 ^ {31} (0 \le j \lt m)

subtask

用錯排序吃TLE

n, m \le 10 ^ 4

subtask

AC

AC

#include <bits/stdc++.h>
using namespace std;
#define int long long

signed main(){
	int n;
	cin >> n;
	map<int,int> mp;
	vector<int> tmp(n);
	for(ll &i:tmp) cin>>i;
	ll b;
	for (int i = 0; i < n; ++i) {
		cin>>b;
		b += tmp[i];
		mp[b] = tmp[i];
	}
	int m;
	cin >> m;
	int ans = 0;
	for (int i = 0,a,b; i < m; ++i) {
		cin >> a >> b;
		auto it1 = mp.upper_bound(a);	
		if (it1 == mp.end()  || it1->second > b) {
			ans++;
		}
	}
	cout << ans << endl;
	return 0;
}
# PRESENTING CODE

AC

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int n,m,sum=0;
    cin>>n;
    vector<pair<int,int>> rest(n);
    for(pair<int,int> &r:rest) cin>>r.first;
    for(pair<int,int> &r:rest) cin>>r.second,r.second+=r.first;
    cin>>m;
    vector<pair<int,int>> race(m);
    for(pair<int,int> &r:race) cin>>r.first>>r.second;
    sort(rest.begin(),rest.end());
    sort(race.begin(),race.end());
    for(int l=0,r=0;r<m;r++){
        for(;l<n&&rest[l].second<race[r].first;l++) ;
        if(l==n||rest[l].first>race[r].second) sum++;
    }
    cout<<sum<<endl;
}
# PRESENTING CODE

Copy of Code

By ckefgisc28th

Copy of Code

  • 123