{我是題解}
好玩ㄇ
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
這題可以喇分
subtask:
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<0;
}
# PRESENTING CODE
subtask
這題可以喇分
恭喜餘切獲得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
subtask
忘記開long long
subtask
用錯排序吃TLE
subtask
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