#include<iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,l;
cin>>n>>l;
int x[n]={},len[l]={};
long long sum=0;
for(int i=0;i<n;i++)
{
int a,b;
cin>>a>>b;
x[b-1]=a;
}
for(int i=0;i<n;i++)
{
int j=x[i],k=x[i];
len[j]++;
while(len[k+1]==0&&k<l-1){
k++;
}
sum+=(k+1);
while(len[j-1]==0&&j>1){
j--;
}
sum-=(j-1);
}
cout<<sum;
}
求大神幫
#include<iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,l;
cin>>n>>l;
int x[n]={};
bool cut[l]={false};
long long sum=0;
for(int i=0;i<n;i++)
{
int a,b;
cin>>a>>b;
x[b-1]=a;
}
for(int i=0;i<n;i++)
{
int j=x[i],k=x[i];
while(cut[k]==false && k<l){
k++;
}
sum+=k;
while(cut[j]==false && j>0){
j--;
}
sum-=j;
cut[x[i]]=true;
}
cout<<sum;
}比較好懂一點的版本 但還是RE
如果是 50% 可能是方向對,方法不好。
一直是 0% 可能連方向都不對。
不妨用中文表達一下想法是什麼,為何這樣寫,
大家才好幫你。
如果是 50% 可能是方向對,方法不好。
一直是 0% 可能連方向都不對。
不妨用中文表達一下想法是什麼,為何這樣寫,
大家才好幫你。
上面的for迴圈純屬輸入
下面兩個while分別是往上跟往下找裁切點
找不到代表尚未裁切過,取原竿子的端點
基本上就是以兩端點的距離差來算切割的長度
而端點可能是之前的裁切點或原本竿子的端點
cut陣列是來存取哪點曾切割過
P. S. Zerojudge判斷是RE(記憶體段位錯誤之類的)
你的 bool cut[l]={false};
題敘 1 ≤ L ≤ 10^7
表示你開了一個 10^7 的陣列。
即使系統允許你開這麼大的陣列。
你在這麼大的陣列裡找數值,效率也不好吧。
你的 bool cut[l]={false};題敘 1 ≤ L ≤ 10^7表示你開了一個 10^7 的陣列。即使系統允許你開這麼大的陣列。你在這麼大的陣列裡找數值,效率也不好吧。
了解~
那假如真的在考APCS會讓我執行嗎(小弟一次都還沒考過)
L 太大,開陣列不太可行 (出題的人有想到了) 往前往後找也很浪費時間
建議看一下我的解題報告,